ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggYTk5OWVjZC4uMzhlM2U1OSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NjExMTcgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NjEyMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk2MTExNzogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBNb3JlIFdpbjMyIGZ1bmN0aW9ucy4KLQktIE9mZmlYLXN0eWxlIGRyYWcgYW5kIGRyb3AuCitXSEFUJ1MgTkVXIHdpdGggV2luZS05NjEyMDE6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQmV0dGVyIFdpbnNvY2suCisJLSBSZXdyaXR0ZW4gbGlzdGJveGVzLgorCS0gV2luZG93cyAzLjEgcmVnaXN0cnkgbG9hZGVyLgorCS0gSW1wcm92ZWQga2V5Ym9hcmQgc3VwcG9ydC4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNiwxMCArMTgsMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYxMTE3LnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MTExNy50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MTExNy50YXIuZ3oKLSAgZnRwOi8vYXJpcy5jb20vcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjExMTcudGFyLmd6CisgIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MTIwMS50YXIuZ3oKKyAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjEyMDEudGFyLmd6CisgIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjEyMDEudGFyLmd6CisgIGZ0cDovL2FyaXMuY29tL3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYxMjAxLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBkODQ4YTkxLi4wZWY4ZDMzIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDQgKzEsMTEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTYXQgTm92IDMwIDE5OjIxOjE3IDE5OTYgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbY29uZmlndXJlXQorCVJlLWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTEuIExldCBtZSBrbm93IGlmIHlvdSBoYXZlCisJcHJvYmxlbXMuCisKKwkqIFtjb250cm9scy9saXN0Ym94LmNdIFtjb250cm9scy9vbGRsYm94LmNdCisJTGlzdGJveGVzIHJld3JpdHRlbiBmcm9tIHNjcmF0Y2guIE1vdmVkIG9sZCBjb2RlIHN0aWxsIHVzZWQgYnkKKwljb21ib2JveGVzIHRvIG9sZGxib3guYworCisJKiBbbWlzYy9yZWdpc3RyeS5jXQorCVVzZSB0ZW1wb3JhcnkgZmlsZSB3aGVuIHNhdmluZyByZWdpc3RyeS4KKworCSogW3dpbmRvd3MvZGlhbG9nLmNdCisJSW1wbGVtZW50ZWQgV2luMzIgdmVyc2lvbiBvZiBEbGdEaXJMaXN0KCkgYW5kIERsZ0Rpckxpc3RDb21ib0JveCgpLgorCisJKiBbd2luZG93cy93aW5wcm9jLmNdCisJQWRkZWQgdHJhbnNsYXRpb24gZm9yIGxpc3Rib3ggV2luMzIgbWVzc2FnZXMuCisKK1NhdCBOb3YgMzAgMjE6MDA6MDAgQWxleCBLb3JvYmthIDxhbGV4QHRyYW50b3IucGhhcm0uc3VueXNiLmVkdT4KKworCSogW2NvbnRyb2xzL3dpZGdldHMuY10gW2NvbnRyb2xzL2J1dHRvbi5jXQorCUZpeGVkIHNvbWUgaW5jb21wYXRpYmlsaXRpZXMgd2l0aCBDVEwzRCBETEwuCisKKwkqIFt3aW5kb3dzL2RpYWxvZy5jXQorCU1hZGUgZGlhbG9nIHdpbmRvd3MgZml0IGludG8gdGhlIGRlc2t0b3AuCisKKwkqIFttaXNjL3dpbnNvY2suY10gW21pc2Mvd2luc29ja19hc3luYy5jXQorCU5ldyBXaW5zb2NrIGVuZ2luZS4KKworCSogW3dpbmRvd3MvbWVzc2FnZS5jXQorCUdldE1lc3NhZ2UoKSBmaXhlcy4KKworCSogW3dpbmRvd3MvcXVldWUuY10gW3dpbmRvd3MvaG9vay5jXSBbd2luZG93cy93aW4uY10KKwlTZXRNZXNzYWdlUXVldWUoKSBmaXhlcy4KKworRnJpIE5vdiAyOSAxMDoyNToxMiAxOTk2ICBTbGF2ZW4gUmV6aWMgIDxlc2VydGVAY3MudHUtYmVybGluLmRlPgorCisJKiBbb2JqZWN0cy90ZXh0LmNdCisJRHJhd1RleHQxNigpOiBGaXhlZCByZXR1cm4gdmFsdWUuCisKK1R1ZSBOb3YgMjYgMTQ6NDc6MDkgMTk5NiAgTWFyY3VzIE1laXNzbmVyIDxtc21laXNzbkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisKKwkqIFtmaWxlcy9wcm9maWxlLmNdIFsqLypdCisJQWRkZWQgV2luMzIgcHJvZmlsZSBmdW5jdGlvbnMsIHVwZGF0ZWQgdG8gbmV3IG5hbWluZyBzdGFuZGFyZC4KKworCSogW29iamVjdHMvZm9udC5jXSBbaWYxNjMyL3RodW5rLmNdIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlBZGRlZCBFbnVtRm9udHMzMiosIEVudW1Gb250RmFtaWxpZXNFeCosIGNoYW5nZWQgcHJvdG90eXBlcyBhbmQKKwlzdHJ1Y3R1cmVzLgorCisJKiBbbWlzYy9vbGUybmxzLmNdIFtpZjE2MzIvdGh1bmsuY10KKwlBZGRlZCBFbnVtU3lzdGVtTG9jYWxlcygpICh3aW5oZWxwLmV4ZSkuCisKKwkqIFttaXNjL3JlZ2lzdHJ5LmNdCisJQWRkZWQgV2luZG93cyAzLjEgcmVnaXN0cnkgbG9hZGVyIHN1cHBsaWVkIGJ5IFRvciBTanh3YWxsLCB0b3JAc24ubm8KKworCSogW3dpbjMyL2ZpbGUuY10KKwlQYXJ0aWFsbHkgZml4ZWQgQ3JlYXRlRmlsZU1hcHBpbmcoKSwgYWRkZWQgVW5tYXBWaWV3T2ZGaWxlKCkuCisKK1NhdCBOb3YgMjMgMjM6MzY6MDUgMTk5NiAgUm9uYW4gV2FpZGUgIDx3YWlkZXJAd2FpZGVyLmllPgorCisJKiBbbWlzYy9zaGVsbC5jXQorCUZpeGVkIHNvbWUgRklYTUVzIHJlbGF0aW5nIHRvIFNoZWxsRXhlYygpIGFuZCBGaW5kRXhlY3V0YWJsZSgpLgorCisJKiBbbWlzYy9tYWluLmNdCisJSW1wbGVtZW50ZWQgYSBmZXcgbW9yZSBvZiB0aGUgU3lzdGVtUGFyYW1ldGVyc0luZm8oKSBjYXNlcy4KKworVHVlIE5vdiAxOSAwMToyNDozNCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBbaW5jbHVkZS9rZXlib2FyZC5oXQorCU5ldyBmaWxlLCBuZXcgbWFjcm8gV0lORV9WS0VZX01BUFBJTkdTICh1c2luZyBjb2RlIHRha2VuIGZyb20gZXZlbnQuYykuCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlOZXcgW1ZLX0EsIFZLX1pdIGFuZCBbVktfMCwgVks5XSBtYWNyb3MuCisKKwkqIFttaXNjL2tleWJvYXJkLmNdCisJRml4ZXMgaW4gS2V5VGFibGUgYW5kIFRvQXNjaWkuCisKKwkqIFtvYmplY3RzL2ZvbnQuY10KKwlGT05UX2luaXQgOiBHaXZlIGRlZmF1bHQgdmFsdWUgZm9yIE1TV0lOICJzeXN0ZW0iIGZvbnQuCisJRk9OVF9NYXRjaEZvbnQgOiBEbyBub3QgdHJ5IGV2ZXJ5IHNpemUgb2YgYSBmb250IGZhbWlseSBpZiB0aGUKKwlmYW1pbHkgZG9lcyBub3QgZXhpc3QuCisKKwkqIFt3aW5kb3dzL2V2ZW50LmNdCisJbGFzdEV2ZW50Q2hhciBoYWNrIHJlbW92ZWQuCisJS2V5U3RhdGVUYWJsZSByZXBsYWNlZCBieSBJbnB1dEtleVN0YXRlVGFibGUgKG1haW50YWluZWQgaW4gZXZlbnQuYykKKwlhbmQgUXVldWVLZXlTdGF0ZVRhYmxlIChtYWludGFpbmVkIGluIG1lc3NhZ2UuYykuCisJRVZFTlRfa2V5IDogQ29ycmVjdGlvbnMgdG8gdGhlIGV4dGVuZGVkIGJpdCBzZXR0aW5nLgorCisJKiBbd2luZG93cy9tZXNzYWdlLmNdIFt3aW5kb3dzL2tleWJvYXJkLmNdCisJSW1wbGVtZW50YXRpb24gb2YgYSBuZXcgUXVldWVLZXlTdGF0ZVRhYmxlIDogdGFibGUgb2Yga2V5IHN0YXRlcworCXZhbGlkIHdoZW4gbWVzc2FnZXMgYXJlIHJldHJpZXZlZCBieSBHZXRNZXNzYWdlIG9yIFBlZWtNZXNzYWdlLAorCWFuZCB2YWxpZCBmb3IgVHJhbnNsYXRlTWVzc2FnZS4KKwlUcmFuc2xhdGVNZXNzYWdlIDogQ29udmVydCBXTSpLRVkgbWVzc2FnZXMgdXNpbmcgUXVldWVLZXlTdGF0ZVRhYmxlCisJYW5kIFRvQXNjaWkuCisJCitNb24gTm92IDE4IDE2OjU5OjAxIDE5OTYgIFJvYmVydCBQb3VsaW90IDxrcnlub3NAY2xpYy5uZXQ+CisKKwkqIFtncmFwaGljcy9NYWtlZmlsZS5pbl0gW2dyYXBoaWNzL3dpbmcuY10KKwkgIFtpZjE2MzIvd2luZy5zcGVjXQorCVNvbWUgZnVuY3Rpb25zIGZvciBXaW5HIHN1cHBvcnQsIG1vc3RseSBlbXB0eSBzdHVicy4KKworCSogW21pc2MvY3J0ZGxsLmNdIFtpZjE2MzIvY3J0ZGxsLnNwZWNdCisJTWFueSBmdW5jdGlvbnMgYWRkZWQgdG8gQ1JURExMLCBtb3N0bHkgY2FsbHMgdG8gVW5peCBDIGxpYnJhcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFN1biBOb3YgMTcgMTU6MDE6NDUgMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CiAKIAkqIFtncmFwaGljcy9iaXRibHQuY10gW2dyYXBoaWNzL3gxMWRydi9iaXRibHQuY10KZGlmZiAtLWdpdCBhL01ha2UucnVsZXMuaW4gYi9NYWtlLnJ1bGVzLmluCmluZGV4IGY4ZDFjOTAuLjI1OTllZGEgMTAwNjQ0Ci0tLSBhL01ha2UucnVsZXMuaW4KKysrIGIvTWFrZS5ydWxlcy5pbgpAQCAtNTksNyArNTksNyBAQAogCWVjaG8gIiNpbmNsdWRlIFwid2luZG93cy5oXCIiID53aW5lcmN0bXAuYwogCWVjaG8gV0lORE9XU19IX0VORFNfSEVSRSA+PndpbmVyY3RtcC5jCiAJY2F0ICQ8ID4+d2luZXJjdG1wLmMKLQkkKENQUCkgJChERUZTKSAkKE9QVElPTlMpICQoRElWSU5DTCkgLURSQ19JTlZPS0VEIC1QIHdpbmVyY3RtcC5jIHwgc2VkIC1lICcxLC9eV0lORE9XU19IX0VORFNfSEVSRS9kJyB8ICQoV0lORVJDKSAtYyAtbyAkKiAtcCAkKgorCSQoQ1BQKSAkKERFRlMpICQoT1BUSU9OUykgJChESVZJTkNMKSAtRFJDX0lOVk9LRUQgLVAgd2luZXJjdG1wLmMgfCBzZWQgLWUgJzEsL15XSU5ET1dTX0hfRU5EU19IRVJFL2QnIHwgJChXSU5FUkMpICQoUkNGTEFHUykgLWMgLW8gJCogLXAgJCoKIAkkKFJNKSB3aW5lcmN0bXAuYwogCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCA2ZDNjODNkLi5lNmQ2N2NmIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0yLDcgKzIsNyBAQAogCiAjIEZyb20gY29uZmlndXJlLmluIGNvbmZpZ3VyZS5pbiAxLjAwCiAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMC1wYXRjaGVkIAorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTEgCiAjIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAjCiAjIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCkBAIC01OCw2ICs1OCw4IEBACiAjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCiBzdWJkaXJzPQogTUZMQUdTPSBNQUtFRkxBR1M9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgogCiBhY19wcmV2PQogZm9yIGFjX29wdGlvbgpAQCAtMzM5LDcgKzM0MSw3IEBACiAgICAgdmVyYm9zZT15ZXMgOzsKIAogICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMC1wYXRjaGVkIgorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjExIgogICAgIGV4aXQgMCA7OwogCiAgIC13aXRoLSogfCAtLXdpdGgtKikKQEAgLTU0Myw4ICs1NDUsNiBAQAogCiAKICMgV2Ugd2FudCB0aGVzZSBiZWZvcmUgdGhlIGNoZWNrcywgc28gdGhlIGNoZWNrcyBjYW4gbW9kaWZ5IHRoZWlyIHZhbHVlcy4KLXRlc3QgLXogIiRDRkxBR1MiICYmIENGTEFHUz0iLWcgLU8yIiAKLXRlc3QgLXogIiRMREZMQUdTIiAmJiBMREZMQUdTPS1nIAogdGVzdCAteiAiJExETElCUyIgJiYgTERMSUJTPS1sbSAKIAogCkBAIC01NzYsNyArNTc2LDggQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9JDIKK2VjaG8gImNvbmZpZ3VyZTo1ODA6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02MDQsNiArNjA1LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjA5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjMyLDYgKzYzNCw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTY3OCw3ICs2ODEsNDIgQEAKICAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KIGZpCiAKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6Njg2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorCithY19leHQ9YworIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKK2FjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjk1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3MDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworCitlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorZmkKKwogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjcyMDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTY4Nyw3ICs3MjUsNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjY5MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzI5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgYWNfY3ZfcHJvZ19nY2M9eWVzCiBlbHNlCiAgIGFjX2N2X3Byb2dfZ2NjPW5vCkBAIC02OTUsMTAgKzczMywxNCBAQAogZmkKIAogZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCiBpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgogICBHQ0M9eWVzCi0gIGlmIHRlc3QgIiR7Q0ZMQUdTK3NldH0iICE9IHNldDsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CisgIGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKyAgQ0ZMQUdTPQorICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc0NDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTcxMywxMSArNzU1LDEyIEBACiBmaQogCiBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjX2ciIDE+JjYKLSAgICBpZiB0ZXN0ICRhY19jdl9wcm9nX2djY19nID0geWVzOyB0aGVuCi0gICAgICBDRkxBR1M9Ii1nIC1PIgotICAgIGVsc2UKLSAgICAgIENGTEFHUz0iLU8iCi0gICAgZmkKKyAgaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgorICAgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgorICBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjX2cgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLU8yIgogICBmaQogZWxzZQogICBHQ0M9CkBAIC03MjUsNiArNzY4LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3NzI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CkBAIC03MzksMzMgKzc4MywzNyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3NDMgImNvbmZpZ3VyZSIKKyNsaW5lIDc4NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NzQ5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3OTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKIGVsc2UKICAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzU4ICJjb25maWd1cmUiCisjbGluZSA4MDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjc2NDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODEwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICA6CiBlbHNlCiAgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBDUFA9L2xpYi9jcHAKIGZpCkBAIC03ODAsMzEgKzgyOCwxMiBAQAogZmkKIGVjaG8gIiRhY190IiIkQ1BQIiAxPiY2CiAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQogIyBJZiB3ZSBmaW5kIFgsIHNldCBzaGVsbCB2YXJzIHhfaW5jbHVkZXMgYW5kIHhfbGlicmFyaWVzIHRvIHRoZQogIyBwYXRocywgb3RoZXJ3aXNlIHNldCBub194PXllcy4KICMgVXNlcyBhY18gdmFycyBhcyB0ZW1wcyB0byBhbGxvdyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgY2FjaGUgYW5kIGNoZWNrcy4KICMgLS13aXRob3V0LXggb3ZlcnJpZGVzIGV2ZXJ5dGhpbmcgZWxzZSwgYnV0IGRvZXMgbm90IHRvdWNoIHRoZSBjYWNoZS4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBYIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Mzc6IGNoZWNraW5nIGZvciBYIiA+JjUKIAogIyBDaGVjayB3aGV0aGVyIC0td2l0aC14IG9yIC0td2l0aG91dC14IHdhcyBnaXZlbi4KIGlmIHRlc3QgIiR7d2l0aF94K3NldH0iID0gc2V0OyB0aGVuCkBAIC04NDQsNyArODczLDkgQEAKICAgICAgICAgYWNfaW1fdXNybGliZGlyPSRhY19pbV9saWJkaXI7IGJyZWFrCiAgICAgICBmaQogICAgIGRvbmUKLSAgICAjIFNjcmVlbiBvdXQgYm9ndXMgdmFsdWVzIGZyb20gdGhlIGltYWtlIGNvbmZpZ3VyYXRpb24uCisgICAgIyBTY3JlZW4gb3V0IGJvZ3VzIHZhbHVlcyBmcm9tIHRoZSBpbWFrZSBjb25maWd1cmF0aW9uLiAgVGhleSBhcmUKKyAgICAjIGJvZ3VzIGJvdGggYmVjYXVzZSB0aGV5IGFyZSB0aGUgZGVmYXVsdCBhbnl3YXksIGFuZCBiZWNhdXNlCisgICAgIyB1c2luZyB0aGVtIHdvdWxkIGJyZWFrIGdjYyBvbiBzeXN0ZW1zIHdoZXJlIGl0IG5lZWRzIGZpeGVkIGluY2x1ZGVzLgogICAgIGNhc2UgIiRhY19pbV9pbmNyb290IiBpbgogCS91c3IvaW5jbHVkZSkgOzsKIAkqKSB0ZXN0IC1mICIkYWNfaW1faW5jcm9vdC9YMTEvWG9zLmgiICYmIGFjX3hfaW5jbHVkZXM9IiRhY19pbV9pbmNyb290IiA7OwpAQCAtODY0LDEyICs4OTUsMTIgQEAKIAogICAjIEZpcnN0LCB0cnkgdXNpbmcgdGhhdCBmaWxlIHdpdGggbm8gc3BlY2lhbCBkaXJlY3Rvcnkgc3BlY2lmaWVkLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODY4ICJjb25maWd1cmUiCisjbGluZSA4OTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPCR4X2RpcmVjdF90ZXN0X2luY2x1ZGU+CiBFT0YKIGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjg3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6OTA0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC04NzcsMzAgKzkwOCwzMiBAQAogYWNfeF9pbmNsdWRlcz0KIGVsc2UKICAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgICMgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlIGluIGEgc3RhbmRhcmQgc2V0IG9mIGNvbW1vbiBkaXJlY3Rvcmllcy4KKyMgQ2hlY2sgWDExIGJlZm9yZSBYMTFSbiBiZWNhdXNlIGl0IGlzIG9mdGVuIGEgc3ltbGluayB0byB0aGUgY3VycmVudCByZWxlYXNlLgogICBmb3IgYWNfZGlyIGluICAgICAgICAgICAgICAgXAorICAgIC91c3IvWDExL2luY2x1ZGUgICAgICAgICAgXAogICAgIC91c3IvWDExUjYvaW5jbHVkZSAgICAgICAgXAogICAgIC91c3IvWDExUjUvaW5jbHVkZSAgICAgICAgXAogICAgIC91c3IvWDExUjQvaW5jbHVkZSAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvaW5jbHVkZS9YMTEgICAgICAgICAgXAogICAgIC91c3IvaW5jbHVkZS9YMTFSNiAgICAgICAgXAogICAgIC91c3IvaW5jbHVkZS9YMTFSNSAgICAgICAgXAogICAgIC91c3IvaW5jbHVkZS9YMTFSNCAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvWDExL2luY2x1ZGUgICAgXAogICAgIC91c3IvbG9jYWwvWDExUjYvaW5jbHVkZSAgXAogICAgIC91c3IvbG9jYWwvWDExUjUvaW5jbHVkZSAgXAogICAgIC91c3IvbG9jYWwvWDExUjQvaW5jbHVkZSAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTEgICAgXAogICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNiAgXAogICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNSAgXAogICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTFSNCAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC91c3IvWDExL2luY2x1ZGUgICAgICAgICAgXAotICAgIC91c3IvaW5jbHVkZS9YMTEgICAgICAgICAgXAotICAgIC91c3IvbG9jYWwvWDExL2luY2x1ZGUgICAgXAotICAgIC91c3IvbG9jYWwvaW5jbHVkZS9YMTEgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIC91c3IvWDM4Ni9pbmNsdWRlICAgICAgICAgXAogICAgIC91c3IveDM4Ni9pbmNsdWRlICAgICAgICAgXAogICAgIC91c3IvWEZyZWU4Ni9pbmNsdWRlL1gxMSAgXApAQCAtOTM2LDQ1ICs5NjksNDYgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKICAgTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTQwICJjb25maWd1cmUiCisjbGluZSA5NzMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCi1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLWludCB0KCkgeworaW50IG1haW4oKSB7CiAke3hfZGlyZWN0X3Rlc3RfZnVuY3Rpb259KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6OTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgogIyBXZSBjYW4gbGluayBYIHByb2dyYW1zIHdpdGggbm8gc3BlY2lhbCBsaWJyYXJ5IHBhdGguCiBhY194X2xpYnJhcmllcz0KIGVsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAgIHJtIC1yZiBjb25mdGVzdCoKICAgTElCUz0iJGFjX3NhdmVfTElCUyIKICMgRmlyc3Qgc2VlIGlmIHJlcGxhY2luZyB0aGUgaW5jbHVkZSBieSBsaWIgd29ya3MuCisjIENoZWNrIFgxMSBiZWZvcmUgWDExUm4gYmVjYXVzZSBpdCBpcyBvZnRlbiBhIHN5bWxpbmsgdG8gdGhlIGN1cnJlbnQgcmVsZWFzZS4KIGZvciBhY19kaXIgaW4gYGVjaG8gIiRhY194X2luY2x1ZGVzIiB8IHNlZCBzL2luY2x1ZGUvbGliL2AgXAorICAgIC91c3IvWDExL2xpYiAgICAgICAgICBcCiAgICAgL3Vzci9YMTFSNi9saWIgICAgICAgIFwKICAgICAvdXNyL1gxMVI1L2xpYiAgICAgICAgXAogICAgIC91c3IvWDExUjQvbGliICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvdXNyL2xpYi9YMTEgICAgICAgICAgXAogICAgIC91c3IvbGliL1gxMVI2ICAgICAgICBcCiAgICAgL3Vzci9saWIvWDExUjUgICAgICAgIFwKICAgICAvdXNyL2xpYi9YMTFSNCAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgL3Vzci9sb2NhbC9YMTEvbGliICAgIFwKICAgICAvdXNyL2xvY2FsL1gxMVI2L2xpYiAgXAogICAgIC91c3IvbG9jYWwvWDExUjUvbGliICBcCiAgICAgL3Vzci9sb2NhbC9YMTFSNC9saWIgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC91c3IvbG9jYWwvbGliL1gxMSAgICBcCiAgICAgL3Vzci9sb2NhbC9saWIvWDExUjYgIFwKICAgICAvdXNyL2xvY2FsL2xpYi9YMTFSNSAgXAogICAgIC91c3IvbG9jYWwvbGliL1gxMVI0ICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvdXNyL1gxMS9saWIgICAgICAgICAgXAotICAgIC91c3IvbGliL1gxMSAgICAgICAgICBcCi0gICAgL3Vzci9sb2NhbC9YMTEvbGliICAgIFwKLSAgICAvdXNyL2xvY2FsL2xpYi9YMTEgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgL3Vzci9YMzg2L2xpYiAgICAgICAgIFwKICAgICAvdXNyL3gzODYvbGliICAgICAgICAgXAogICAgIC91c3IvWEZyZWU4Ni9saWIvWDExICBcCkBAIC05ODUsNiArMTAxOSw3IEBACiAgICAgL3Vzci9hdGhlbmEvbGliICAgICAgIFwKICAgICAvdXNyL2xvY2FsL3gxMXI1L2xpYiAgXAogICAgIC91c3IvbHBwL1hhbXBsZXMvbGliICBcCisgICAgL2xpYi91c3IvbGliL1gxMQkgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIC91c3Ivb3Blbndpbi9saWIgICAgICBcCiAgICAgL3Vzci9vcGVud2luL3NoYXJlL2xpYiBcCkBAIC0xMDMwLDc0ICsxMDY1LDgzIEBACiAKIGlmIHRlc3QgIiRub194IiA9IHllczsgdGhlbgogICAjIE5vdCBhbGwgcHJvZ3JhbXMgbWF5IHVzZSB0aGlzIHN5bWJvbCwgYnV0IGl0IGRvZXMgbm90IGh1cnQgdG8gZGVmaW5lIGl0LgotICBYX0NGTEFHUz0iJFhfQ0ZMQUdTIC1EWF9ESVNQTEFZX01JU1NJTkciCisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBYX0RJU1BMQVlfTUlTU0lORyAxCitFT0YKKworICBYX0NGTEFHUz0gWF9QUkVfTElCUz0gWF9MSUJTPSBYX0VYVFJBX0xJQlM9CiBlbHNlCiAgIGlmIHRlc3QgLW4gIiR4X2luY2x1ZGVzIjsgdGhlbgogICAgIFhfQ0ZMQUdTPSIkWF9DRkxBR1MgLUkkeF9pbmNsdWRlcyIKICAgZmkKIAotICAjIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciB0aGUgLVIgbGQgb3B0aW9uIHRoYW4KLSAgIyBqdXN0IGNoZWNraW5nIGZvciBTb2xhcmlzLgogICAjIEl0IHdvdWxkIGFsc28gYmUgbmljZSB0byBkbyB0aGlzIGZvciBhbGwgLUwgb3B0aW9ucywgbm90IGp1c3QgdGhpcyBvbmUuCiAgIGlmIHRlc3QgLW4gIiR4X2xpYnJhcmllcyI7IHRoZW4KICAgICBYX0xJQlM9IiRYX0xJQlMgLUwkeF9saWJyYXJpZXMiCi0gICAgaWYgdGVzdCAiYCh1bmFtZSkgMj4vZGV2L251bGxgIiA9IFN1bk9TICYmCi0gICAgICB1bmFtZSAtciB8IGdyZXAgJ141JyA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBYX0xJQlM9IiRYX0xJQlMgLVIgJHhfbGlicmFyaWVzIgotICAgIGZpCi0gIGZpCi0KLSAgIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgWDExUjYgWHQvWGF3IHByb2dyYW1zIG5lZWQuCi0KLSAgYWNfc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLSAgTERGTEFHUz0iJExERkxBR1MgLUwkeF9saWJyYXJpZXMiCi0gICMgU00gbmVlZHMgSUNFIHRvIChkeW5hbWljYWxseSkgbGluayB1bmRlciBTdW5PUyA0LnggKHNvIHdlIGhhdmUgdG8KLSAgIyBjaGVjayBmb3IgSUNFIGZpcnN0KSwgYnV0IHdlIG11c3QgbGluayBpbiB0aGUgb3JkZXIgLWxTTSAtbElDRSBvcgotICAjIHdlIGdldCB1bmRlZmluZWQgc3ltYm9scy4gIFNvIGFzc3VtZSB3ZSBoYXZlIFNNIGlmIHdlIGhhdmUgSUNFLgotICAjIFRoZXNlIGhhdmUgdG8gYmUgbGlua2VkIHdpdGggYmVmb3JlIC1sWDExLCB1bmxpa2UgdGhlIG90aGVyCi0gICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgotICAjICAtLWludGVycmFuQHVsdXJ1LlN0YW5mb3JkLkVEVSwga2JAY3MudW1iLmVkdS4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1sSUNFIiIuLi4gJGFjX2MiIDE+JjYKLWFjX2xpYl92YXI9YGVjaG8gSUNFJ18nSWNlQ29ubmVjdGlvbk51bWJlciB8IHRyICcuLytcMDU1JyAnX19wXydgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sSUNFICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNjkgImNvbmZpZ3VyZSIKKyAgICAjIEZvciBTb2xhcmlzOyBzb21lIHZlcnNpb25zIG9mIFN1biBDQyByZXF1aXJlIGEgc3BhY2UgYWZ0ZXIgLVIgYW5kCisgICAgIyBvdGhlcnMgcmVxdWlyZSBubyBzcGFjZS4gIFdvcmRzIGFyZSBub3Qgc3VmZmljaWVudCAuIC4gLiAuCisgICAgY2FzZSAiYCh1bmFtZSAtc3IpIDI+L2Rldi9udWxsYCIgaW4KKyAgICAiU3VuT1MgNSIqKQorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwODc6IGNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiA+JjUKKyAgICAgIGFjX3hzYXZlX0xJQlM9IiRMSUJTIjsgTElCUz0iJExJQlMgLVIkeF9saWJyYXJpZXMiCisgICAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDkwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgSWNlQ29ubmVjdGlvbk51bWJlcigpOwogCi1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLWludCB0KCkgewotSWNlQ29ubmVjdGlvbk51bWJlcigpCitpbnQgbWFpbigpIHsKKwogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwODE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKKyAgYWNfUl9ub3NwYWNlPXllcwogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCisgIGFjX1Jfbm9zcGFjZT1ubwogZmkKIHJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKIAotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgWF9QUkVfTElCUz0iJFhfUFJFX0xJQlMgLWxTTSAtbElDRSIKKyAgICAgIGlmIHRlc3QgJGFjX1Jfbm9zcGFjZSA9IHllczsgdGhlbgorCWVjaG8gIiRhY190IiJubyIgMT4mNgorCVhfTElCUz0iJFhfTElCUyAtUiR4X2xpYnJhcmllcyIKKyAgICAgIGVsc2UKKwlMSUJTPSIkYWNfeHNhdmVfTElCUyAtUiAkeF9saWJyYXJpZXMiCisJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTExNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgYWNfUl9zcGFjZT15ZXMKIGVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGFjX1Jfc3BhY2U9bm8KIGZpCitybSAtZiBjb25mdGVzdCoKIAotICBMREZMQUdTPSIkYWNfc2F2ZV9MREZMQUdTIgorCWlmIHRlc3QgJGFjX1Jfc3BhY2UgPSB5ZXM7IHRoZW4KKwkgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKwkgIFhfTElCUz0iJFhfTElCUyAtUiAkeF9saWJyYXJpZXMiCisJZWxzZQorCSAgZWNobyAiJGFjX3QiIm5laXRoZXIgd29ya3MiIDE+JjYKKwlmaQorICAgICAgZmkKKyAgICAgIExJQlM9IiRhY194c2F2ZV9MSUJTIgorICAgIGVzYWMKKyAgZmkKIAogICAjIENoZWNrIGZvciBzeXN0ZW0tZGVwZW5kZW50IGxpYnJhcmllcyBYIHByb2dyYW1zIG11c3QgbGluayB3aXRoLgorICAjIERvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGZvciB0aGUgc3lzdGVtLWluZGVwZW5kZW50IFI2IGxpYnJhcmllcworICAjICgtbElDRSksIHNpbmNlIHdlIG1heSBuZWVkIC1sc29ja2V0IG9yIHdoYXRldmVyIGZvciBYIGxpbmtpbmcuCiAKICAgaWYgdGVzdCAiJElTQyIgPSB5ZXM7IHRoZW4KICAgICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxuc2xfcyAtbGluZXQiCkBAIC0xMTA1LDMwICsxMTQ5LDMyIEBACiAgICAgIyBNYXJ0eW4uSm9obnNvbkBjbC5jYW0uYWMudWsgc2F5cyB0aGlzIGlzIG5lZWRlZCBmb3IgVWx0cml4LCBpZiB0aGUgWAogICAgICMgbGlicmFyaWVzIHdlcmUgYnVpbHQgd2l0aCBERUNuZXQgc3VwcG9ydC4gIEFuZCBrYXJsQGNzLnVtYi5lZHUgc2F5cwogICAgICMgdGhlIEFscGhhIG5lZWRzIGRuZXRfc3R1YiAoZG5ldCBkb2VzIG5vdCBleGlzdCkuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1sZG5ldCIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvIGRuZXQnXydkbmV0X250b2EgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMTU0OiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1CithY19saWJfdmFyPWBlY2hvIGRuZXQnXydkbmV0X250b2EgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sZG5ldCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTE3ICJjb25maWd1cmUiCisjbGluZSAxMTYyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCiAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgZG5ldF9udG9hKCk7CiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7CitpbnQgbWFpbigpIHsKIGRuZXRfbnRvYSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTczOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCiBmaQpAQCAtMTE0NCwzMCArMTE5MCwzMiBAQAogZmkKIAogICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgLWxkbmV0X3N0dWIiIi4uLiAkYWNfYyIgMT4mNgotYWNfbGliX3Zhcj1gZWNobyBkbmV0X3N0dWInXydkbmV0X250b2EgfCB0ciAnLi8rXDA1NScgJ19fcF8nYAorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE5NTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXRfc3R1YiIgPiY1CithY19saWJfdmFyPWBlY2hvIGRuZXRfc3R1YidfJ2RuZXRfbnRvYSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE1NiAiY29uZmlndXJlIgorI2xpbmUgMTIwMyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgogICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCiBjaGFyIGRuZXRfbnRvYSgpOwogCi1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLWludCB0KCkgeworaW50IG1haW4oKSB7CiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgogZmkKQEAgLTExODYsMzIgKzEyMzQsODUgQEAKIAogICAgICMgbXNoQGNpcy51ZmwuZWR1IHNheXMgLWxuc2wgKGFuZCAtbHNvY2tldCkgYXJlIG5lZWRlZCBmb3IgaGlzIDM4Ni9BVCwKICAgICAjIHRvIGdldCB0aGUgU3lzViB0cmFuc3BvcnQgZnVuY3Rpb25zLgotICAgICMgTm90IHN1cmUgd2hpY2ggZmxhdm9yIG9mIDM4NiBVTklYIHRoaXMgaXMsIGJ1dCBpdCBzZWVtcyBoYXJtbGVzcyB0bwotICAgICMgY2hlY2sgZm9yIGl0LgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvIG5zbCdfJ3RfYWNjZXB0IHwgdHIgJy4vK1wwNTUnICdfX3BfJ2AKKyAgICAjIGNoYWRAYW5hc2F6aS5jb20gc2F5cyB0aGUgUHlyYW1pcyBNSVMtRVMgcnVubmluZyBEQy9PU3ggKFNWUjQpCisgICAgIyBuZWVkcyAtbG5zbC4KKyAgICAjIFRoZSBuc2wgbGlicmFyeSBwcmV2ZW50cyBwcm9ncmFtcyBmcm9tIG9wZW5pbmcgdGhlIFggZGlzcGxheQorICAgICMgb24gSXJpeCA1LjIsIGFjY29yZGluZyB0byBkaWNrZXlAY2xhcmsubmV0LgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjQzOiBjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTI0OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBnZXRob3N0YnluYW1lKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2dldGhvc3RieW5hbWUpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2dldGhvc3RieW5hbWUpCitjaG9rZSBtZQorI2Vsc2UKK2dldGhvc3RieW5hbWUoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nZ2V0aG9zdGJ5bmFtZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTI5MjogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorYWNfbGliX3Zhcj1gZWNobyBuc2wnXydnZXRob3N0YnluYW1lIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbG5zbCAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjAwICJjb25maWd1cmUiCisjbGluZSAxMzAwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCiAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgdF9hY2NlcHQoKTsKK2NoYXIgZ2V0aG9zdGJ5bmFtZSgpOwogCi1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLWludCB0KCkgewotdF9hY2NlcHQoKQoraW50IG1haW4oKSB7CitnZXRob3N0YnluYW1lKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjEyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKIGZpCkBAIC0xMjI2LDM2ICsxMzI3LDkwIEBACiAgIGVjaG8gIiRhY190IiJubyIgMT4mNgogZmkKIAorICAgIGZpCiAKICAgICAjIGxpZWRlckBza3lsZXIubWF2ZC5ob25leXdlbGwuY29tIHNheXMgd2l0aG91dCAtbHNvY2tldCwKLSAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQgMi4wLgotICAgICMgQnV0IC1sc29ja2V0IGlzIGJyb2tlbiBvbiBJUklYLCBhY2NvcmRpbmcgdG8gc2ltb25AbGlhLmRpLmVwZmwuY2guCi0gICAgaWYgdGVzdCAiYCh1bmFtZSkgMj4vZGV2L251bGxgIiAhPSBJUklYOyB0aGVuCi0gICAgICBpZiB0ZXN0ICRhY19jdl9saWJfbnNsX3RfYWNjZXB0ID0gbm87IHRoZW4KLSAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1sc29ja2V0IiIuLi4gJGFjX2MiIDE+JjYKLWFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nc29ja2V0IHwgdHIgJy4vK1wwNTUnICdfX3BfJ2AKKyAgICAjIHNvY2tldC9zZXRzb2Nrb3B0IGFuZCBvdGhlciByb3V0aW5lcyBhcmUgdW5kZWZpbmVkIHVuZGVyIFNDTyBPRFQKKyAgICAjIDIuMC4gIEJ1dCAtbHNvY2tldCBpcyBicm9rZW4gb24gSVJJWCA1LjIgKGFuZCBpcyBub3QgbmVjZXNzYXJ5CisgICAgIyBvbiBsYXRlciB2ZXJzaW9ucyksIHNheXMgc2ltb25AbGlhLmRpLmVwZmwuY2g6IGl0IGNvbnRhaW5zCisgICAgIyBnZXRob3N0YnkqIHZhcmlhbnRzIHRoYXQgZG9uJ3QgdXNlIHRoZSBuYW1lc2VydmVyIChvciBzb21ldGhpbmcpLgorICAgICMgLWxzb2NrZXQgbXVzdCBiZSBnaXZlbiBiZWZvcmUgLWxuc2wgaWYgYm90aCBhcmUgbmVlZGVkLgorICAgICMgV2UgYXNzdW1lIHRoYXQgaWYgY29ubmVjdCBuZWVkcyAtbG5zbCwgc28gZG9lcyBnZXRob3N0YnluYW1lLgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjb25uZWN0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzQxOiBjaGVja2luZyBmb3IgY29ubmVjdCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19jb25uZWN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM0NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCisgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBjb25uZWN0KCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgY29ubmVjdCgpOworCitpbnQgbWFpbigpIHsKKworLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCisjaWYgZGVmaW5lZCAoX19zdHViX2Nvbm5lY3QpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Nvbm5lY3QpCitjaG9rZSBtZQorI2Vsc2UKK2Nvbm5lY3QoKTsKKyNlbmRpZgorCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PXllcyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfZnVuY19jb25uZWN0PW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nY29ubmVjdGBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCisgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTM5MDogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorYWNfbGliX3Zhcj1gZWNobyBzb2NrZXQnXydjb25uZWN0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbHNvY2tldCAgJExJQlMiCitMSUJTPSItbHNvY2tldCAkWF9FWFRSQV9MSUJTICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI0NCAiY29uZmlndXJlIgorI2xpbmUgMTM5OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgogICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHNvY2tldCgpOworY2hhciBjb25uZWN0KCk7CiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7Ci1zb2NrZXQoKQoraW50IG1haW4oKSB7Citjb25uZWN0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjU2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKIGZpCkBAIC0xMjY1LDM3ICsxNDIwLDg5IEBACiBmaQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxzb2NrZXQiCisgIFhfRVhUUkFfTElCUz0iLWxzb2NrZXQgJFhfRVhUUkFfTElCUyIKIGVsc2UKICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CiBmaQogCi0gICAgICBlbHNlCi0gICAgICAgICMgSWYgd2UgZm91bmQgLWxuc2wsIHVzZSBpdCB0byBjaGVjayBmb3IgLWxzb2NrZXQuIC0tIEFKCi0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1hY19saWJfdmFyPWBlY2hvIHNvY2tldCdfJ3NvY2tldCB8IHRyICcuLytcMDU1JyAnX19wXydgCisgICAgZmkKKworICAgICMgZ29tZXpAbWkudW5pLWVybGFuZ2VuLmRlIHNheXMgLWxwb3NpeCBpcyBuZWNlc3Nhcnkgb24gQS9VWC4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVtb3ZlIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDMzOiBjaGVja2luZyBmb3IgcmVtb3ZlIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3JlbW92ZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCisgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE0MzggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcmVtb3ZlKCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgcmVtb3ZlKCk7CisKK2ludCBtYWluKCkgeworCisvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKyNpZiBkZWZpbmVkIChfX3N0dWJfcmVtb3ZlKSB8fCBkZWZpbmVkIChfX3N0dWJfX19yZW1vdmUpCitjaG9rZSBtZQorI2Vsc2UKK3JlbW92ZSgpOworI2VuZGlmCisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDYxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3JlbW92ZT15ZXMiCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfcmVtb3ZlPW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ncmVtb3ZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIDoKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19yZW1vdmUgPSBubzsgdGhlbgorICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDgyOiBjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiID4mNQorYWNfbGliX3Zhcj1gZWNobyBwb3NpeCdfJ3JlbW92ZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCitMSUJTPSItbHBvc2l4ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyODQgImNvbmZpZ3VyZSIKKyNsaW5lIDE0OTAgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBzb2NrZXQoKTsKK2NoYXIgcmVtb3ZlKCk7CiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7Ci1zb2NrZXQoKQoraW50IG1haW4oKSB7CityZW1vdmUoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyOTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgogZmkKQEAgLTEzMDUsMTQgKzE1MTIsMTU3IEBACiBmaQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxzb2NrZXQiCisgIFhfRVhUUkFfTElCUz0iJFhfRVhUUkFfTElCUyAtbHBvc2l4IgogZWxzZQogICBlY2hvICIkYWNfdCIibm8iIDE+JjYKIGZpCiAKLSAgICAgIGZpCisgICAgZmkKKworICAgICMgQlNESSBCU0QvT1MgMi4xIG5lZWRzIC1saXBjIGZvciBYT3BlbkRpc3BsYXkuCisgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTI1OiBjaGVja2luZyBmb3Igc2htYXQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfc2htYXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNTMwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHNobWF0KCk7IGJlbG93LiAgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKy8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCisvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCisgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KK2NoYXIgc2htYXQoKTsKKworaW50IG1haW4oKSB7CisKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgKF9fc3R1Yl9zaG1hdCkgfHwgZGVmaW5lZCAoX19zdHViX19fc2htYXQpCitjaG9rZSBtZQorI2Vsc2UKK3NobWF0KCk7CisjZW5kaWYKKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2Z1bmNfc2htYXQ9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9mdW5jX3NobWF0PW5vIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nc2htYXRgXCIgPSB5ZXMiOyB0aGVuCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKyAgOgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3NobWF0ID0gbm87IHRoZW4KKyAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTU3NDogY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gaXBjJ18nc2htYXQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKK0xJQlM9Ii1saXBjICAkTElCUyIKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE1ODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKyAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworY2hhciBzaG1hdCgpOworCitpbnQgbWFpbigpIHsKK3NobWF0KCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTkzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX0VYVFJBX0xJQlM9IiRYX0VYVFJBX0xJQlMgLWxpcGMiCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKwogICAgIGZpCiAgIGZpCisKKyAgIyBDaGVjayBmb3IgbGlicmFyaWVzIHRoYXQgWDExUjYgWHQvWGF3IHByb2dyYW1zIG5lZWQuCisgIGFjX3NhdmVfTERGTEFHUz0iJExERkxBR1MiCisgIHRlc3QgLW4gIiR4X2xpYnJhcmllcyIgJiYgTERGTEFHUz0iJExERkxBR1MgLUwkeF9saWJyYXJpZXMiCisgICMgU00gbmVlZHMgSUNFIHRvIChkeW5hbWljYWxseSkgbGluayB1bmRlciBTdW5PUyA0LnggKHNvIHdlIGhhdmUgdG8KKyAgIyBjaGVjayBmb3IgSUNFIGZpcnN0KSwgYnV0IHdlIG11c3QgbGluayBpbiB0aGUgb3JkZXIgLWxTTSAtbElDRSBvcgorICAjIHdlIGdldCB1bmRlZmluZWQgc3ltYm9scy4gIFNvIGFzc3VtZSB3ZSBoYXZlIFNNIGlmIHdlIGhhdmUgSUNFLgorICAjIFRoZXNlIGhhdmUgdG8gYmUgbGlua2VkIHdpdGggYmVmb3JlIC1sWDExLCB1bmxpa2UgdGhlIG90aGVyCisgICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgorICAjICAtLWludGVycmFuQHVsdXJ1LlN0YW5mb3JkLkVEVSwga2JAY3MudW1iLmVkdS4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2MjY6IGNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiA+JjUKK2FjX2xpYl92YXI9YGVjaG8gSUNFJ18nSWNlQ29ubmVjdGlvbk51bWJlciB8IHNlZCAneSUuLystJV9fcF8lJ2AKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBhY19zYXZlX0xJQlM9IiRMSUJTIgorTElCUz0iLWxJQ0UgICRMSUJTIgorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTYzNCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyIEljZUNvbm5lY3Rpb25OdW1iZXIoKTsKKworaW50IG1haW4oKSB7CitJY2VDb25uZWN0aW9uTnVtYmVyKCkKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjQ1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitMSUJTPSIkYWNfc2F2ZV9MSUJTIgorCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBYX1BSRV9MSUJTPSIkWF9QUkVfTElCUyAtbFNNIC1sSUNFIgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKKyAgTERGTEFHUz0iJGFjX3NhdmVfTERGTEFHUyIKKwogZmkKIAogZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwpAQCAtMTMyMCw2ICsxNjcwLDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE2NzQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTEzNTEsNiArMTcwMiw3IEBACiAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTcwNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xMzgyLDMwICsxNzM0LDMyIEBACiAgIGZsZXgqKSBhY19saWI9ZmwgOzsKICAgKikgYWNfbGliPWwgOzsKICAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWFjX2xpYl92YXI9YGVjaG8gJGFjX2xpYidfJ3l5d3JhcCB8IHRyICcuLytcMDU1JyAnX19wXydgCisgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNzM5OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1CithY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzk0ICJjb25maWd1cmUiCisjbGluZSAxNzQ3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCiAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgeXl3cmFwKCk7CiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7CitpbnQgbWFpbigpIHsKIHl5d3JhcCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCiBmaQpAQCAtMTQyNSw2ICsxNzc5LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTc4MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNDYxLDYgKzE4MTYsNyBAQAogIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgogIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODIwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNTA5LDMwICsxODY1LDMyIEBACiAKIHRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCiAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAtbGkzODYiIi4uLiAkYWNfYyIgMT4mNgotYWNfbGliX3Zhcj1gZWNobyBpMzg2J18naTM4Nl9zZXRfbGR0IHwgdHIgJy4vK1wwNTUnICdfX3BfJ2AKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxODcwOiBjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIgPiY1CithY19saWJfdmFyPWBlY2hvIGkzODYnXydpMzg2X3NldF9sZHQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1saTM4NiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTIxICJjb25maWd1cmUiCisjbGluZSAxODc4ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCiAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgaTM4Nl9zZXRfbGR0KCk7CiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7CitpbnQgbWFpbigpIHsKIGkzODZfc2V0X2xkdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCiBmaQpAQCAtMTU1Miw0MSArMTkxMCw0NyBAQAogaWYgdGVzdCAieCR7R0NDfSIgPSAieHllcyIKIHRoZW4KICAgQ0ZMQUdTPSIkQ0ZMQUdTIC1XYWxsIgotICAjIElmIHdlIGNhbm5vdCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIG11c3QgYmUgY3Jvc3MgY29tcGlsaW5nLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBjcm9zcy1jb21waWxpbmciIi4uLiAkYWNfYyIgMT4mNgorICAjIElmIHdlIGNhbm5vdCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB1c2luZyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTE2OiBjaGVja2luZyB3aGV0aGVyIHVzaW5nIGEgY3Jvc3MtY29tcGlsZXIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY3Jvc3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgogICBhY19jdl9jX2Nyb3NzPXllcwogZWxzZQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU2NSAiY29uZmlndXJlIgorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxOTI0ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIG1haW4oKXtyZXR1cm4oMCk7fQogRU9GCi17IChldmFsIGVjaG8gY29uZmlndXJlOjE1Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MTkyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfQogaWYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KICAgYWNfY3ZfY19jcm9zcz1ubwogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgogICBhY19jdl9jX2Nyb3NzPXllcwogZmkKLWZpCiBybSAtZnIgY29uZnRlc3QqCiBmaQogCitmaQorCiBlY2hvICIkYWNfdCIiJGFjX2N2X2NfY3Jvc3MiIDE+JjYKIGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfY19jcm9zcwogCiAgIGVjaG8gJGFjX24gImNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxOTQ2OiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJ5ZXMiCiBlbHNlCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNTkwICJjb25maWd1cmUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDE5NTQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbih2b2lkKSB7CkBAIC0xNTk3LDE0ICsxOTYxLDE4IEBACiAgIGV4aXQoIEFycmF5WzFdICE9IC0yICk7CiB9CiBFT0YKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9CiBpZiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9Im5vIgogZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgogICBhY19jdl9jX2djY19zdHJlbmd0aF9idWc9InllcyIKIGZpCitybSAtZnIgY29uZnRlc3QqCiBmaQotcm0gLWZyIGNvbmZ0ZXN0KiAKKyAKIGZpCiAKIGVjaG8gIiRhY190IiIkYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnIiAxPiY2CkBAIC0xNjE2LDYgKzE5ODQsNyBAQAogCiAKIGVjaG8gJGFjX24gImNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE5ODg6IGNoZWNraW5nICJ3aGV0aGVyIGV4dGVybmFsIHN5bWJvbHMgbmVlZCBhbiB1bmRlcnNjb3JlIHByZWZpeCIiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfZXh0ZXJuX3ByZWZpeCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNjI3LDE4ICsxOTk2LDE5IEBACiAJLmxvbmcgMAogRU9GCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjMxICJjb25maWd1cmUiCisjbGluZSAyMDAwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIGV4dGVybiBpbnQgYWNfdGVzdDsKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7CitpbnQgbWFpbigpIHsKIGlmIChhY190ZXN0KSByZXR1cm4gMQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfZXh0ZXJuX3ByZWZpeD0ibm8iCiBmaQpAQCAtMTY2MCwxMSArMjAzMCwxMiBAQAogZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSB0Y2dldGF0dHIgdXNsZWVwCiBkbwogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjY4ICJjb25maWd1cmUiCisjbGluZSAyMDM5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTE2NzQsOCArMjA0NSw3IEBACiAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KIGNoYXIgJGFjX2Z1bmMoKTsKIAotaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1pbnQgdCgpIHsKK2ludCBtYWluKCkgewogCiAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCiAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKQEAgLTE2ODgsMTAgKzIwNTgsMTIgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCiBmaQpAQCAtMTcxMSwxMSArMjA4MywxMiBAQAogZG9uZQogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToyMDg3OiBjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzE5ICJjb25maWd1cmUiCisjbGluZSAyMDkyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMTc2NiwxNSArMjEzOSwxNSBAQAogZmkKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIxNDM6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTc3NCAiY29uZmlndXJlIgorI2xpbmUgMjE0OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7CitpbnQgbWFpbigpIHsKIAogLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KIHR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKQEAgLTE4MjAsMTAgKzIxOTMsMTIgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE4MjQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjE5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9bm8KIGZpCkBAIC0xODQwLDExICsyMjE1LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MjIxOTogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg0OCAiY29uZmlndXJlIgorI2xpbmUgMjIyNCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CkBAIC0xODUyLDEzICsyMjI4LDE1IEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg1NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KK3sgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKIGVsc2UKICAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBmaQpAQCAtMTg2Nyw3ICsyMjQ1LDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NzEgImNvbmZpZ3VyZSIKKyNsaW5lIDIyNDkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC0xODg1LDcgKzIyNjMsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTg4OSAiY29uZmlndXJlIgorI2xpbmUgMjI2NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTE5MDUsOCArMjI4Myw4IEBACiBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgogICA6CiBlbHNlCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTEwICJjb25maWd1cmUiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDIyODggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CiAjZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKQEAgLTE5MTcsMTUgKzIyOTUsMTkgQEAKIGV4aXQgKDApOyB9CiAKIEVPRgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjIyOTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0KIGlmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCiAgIDoKIGVsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1mciBjb25mdGVzdCoKICAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KIGZpCi1maQogcm0gLWZyIGNvbmZ0ZXN0KgogZmkKKworZmkKIGZpCiAKIGVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKQEAgLTE5MzcsMTkgKzIzMTksMjEgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjIzMjM6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk0NSAiY29uZmlndXJlIgorI2xpbmUgMjMyOCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWYgU1REQ19IRUFERVJTCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZW5kaWYKIEVPRgogaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAic2l6ZV90IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X3R5cGVfc2l6ZV90PXllcwogZWxzZQpAQCAtMTk5MSw4ICsyMzc1LDkgQEAKIEVPRgogIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCiAjIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgorIyBIUC1VWCAxMC4wMSBzaCBwcmludHMgc2luZ2xlIHF1b3RlcyBhcm91bmQgYW55IHZhbHVlIHRoYXQgY29udGFpbnMgc3BhY2VzLgogKHNldCkgMj4mMSB8Ci0gIHNlZCAtbiAicy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9XCR7XDE9J1wyJ30vcCIgXAorc2VkIC1uICJzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPScqXChbXiddKlwpJyovXDE9XCR7XDE9J1wyJ30vcCJcCiAgID4+IGNvbmZjYWNoZQogaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgogICA6CkBAIC0yMDQ4LDcgKzI0MzMsNyBAQAogICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKICAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMC1wYXRjaGVkIgorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTEiCiAgICAgZXhpdCAwIDs7CiAgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQogICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKQEAgLTIxMzcsNiArMjUyMiw0MiBAQAogCiBDRU9GCiBFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorCisjIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAorIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCithY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KK2FjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorYWNfbW9yZV9saW5lcz06CithY19zZWRfY21kcz0iIgord2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCisgIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgorICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZmkKKyAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKyAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKKyAgZWxzZQorICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKyAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGVsc2UKKyAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorICAgIGZpCisgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCisgICAgYWNfYmVnPSRhY19lbmQKKyAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCisgIGZpCitkb25lCitpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgIGFjX3NlZF9jbWRzPWNhdAorZmkKK0VPRgorCiBjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKIAogQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZS5ydWxlcwpAQCAtMjE3Niw3ICsyNTk3LDcgQEAKICAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKICAgZXNhYwogCi0gICMgQWRqdXN0IHJlbGF0aXZlIHNyY2RpciwgZXRjLiBmb3Igc3ViZGlyZWN0b3JpZXMuCisgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCiAKICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCiAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCkBAIC0yMjA0LDYgKzI2MjUsNyBAQAogICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7CiAgICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7CiAgIGVzYWMKKwogICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKICAgcm0gLWYgIiRhY19maWxlIgogICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKQEAgLTIyMTcsOSArMjYzOSw5IEBACiBzJUBzcmNkaXJAJSRzcmNkaXIlZwogcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwogcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAtZiBjb25mdGVzdC5zdWJzICRhY19naXZlbl9zcmNkaXIvJGFjX2ZpbGVfaW4gPiAkYWNfZmlsZQorIiAkYWNfZ2l2ZW5fc3JjZGlyLyRhY19maWxlX2luIHwgZXZhbCAiJGFjX3NlZF9jbWRzIiA+ICRhY19maWxlCiBmaTsgZG9uZQotcm0gLWYgY29uZnRlc3Quc3Vicworcm0gLWYgY29uZnRlc3QucyoKIAogIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKICMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KQEAgLTIyNDAsNyArMjY2MiwxMyBAQAogYWNfZUM9JyAnCiBhY19lRD0nJWcnCiAKLUNPTkZJR19IRUFERVJTPSR7Q09ORklHX0hFQURFUlMtImluY2x1ZGUvY29uZmlnLmgifQoraWYgdGVzdCAteiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKyAgQ09ORklHX0hFQURFUlM9ImluY2x1ZGUvY29uZmlnLmgiCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZpCiBmb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCiAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KICAgY2FzZSAiJGFjX2ZpbGUiIGluCkBAIC0yMjgwLDggKzI3MDgsNiBAQAogCiAjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KICMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNpbmdsZSBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKIAogcm0gLWYgY29uZnRlc3QudGFpbAogd2hpbGUgOgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IGU5NmFiY2MuLjhlNDkxMDUgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTcsOCArNyw2IEBACiBBQ19DT05GSUdfQVVYX0RJUih0b29scykKIAogIyBXZSB3YW50IHRoZXNlIGJlZm9yZSB0aGUgY2hlY2tzLCBzbyB0aGUgY2hlY2tzIGNhbiBtb2RpZnkgdGhlaXIgdmFsdWVzLgotdGVzdCAteiAiJENGTEFHUyIgJiYgQ0ZMQUdTPSItZyAtTzIiIEFDX1NVQlNUKENGTEFHUykKLXRlc3QgLXogIiRMREZMQUdTIiAmJiBMREZMQUdTPS1nIEFDX1NVQlNUKExERkxBR1MpCiB0ZXN0IC16ICIkTERMSUJTIiAmJiBMRExJQlM9LWxtIEFDX1NVQlNUKExETElCUykKIAogZG5sICoqKiogQ29tbWFuZC1saW5lIGFyZ3VtZW50cyAqKioqCmRpZmYgLS1naXQgYS9jb250cm9scy9NYWtlZmlsZS5pbiBiL2NvbnRyb2xzL01ha2VmaWxlLmluCmluZGV4IDA5MTg4YjUuLjdmN2RmZjkgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL01ha2VmaWxlLmluCisrKyBiL2NvbnRyb2xzL01ha2VmaWxlLmluCkBAIC0xMiw2ICsxMiw3IEBACiAJZWRpdC5jIFwKIAlsaXN0Ym94LmMgXAogCW1lbnUuYyBcCisJb2xkbGJveC5jIFwKIAlzY3JvbGwuYyBcCiAJc3RhdGljLmMgXAogCXN0YXR1cy5jIFwKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggMzM2N2E2Ni4uMWM0ZGY3ZSAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTE4Nyw3ICsxODcsOCBAQAogCiAgICAgY2FzZSBXTV9LSUxMRk9DVVM6CiAgICAgICAgIGluZm9QdHItPnN0YXRlICY9IH5CVVRUT05fSEFTRk9DVVM7Ci0gICAgICAgIFBBSU5UX0JVVFRPTiggd25kUHRyLCBzdHlsZSwgT0RBX0ZPQ1VTICk7CisJUEFJTlRfQlVUVE9OKCB3bmRQdHIsIHN0eWxlLCBPREFfRk9DVVMgKTsKKwlJbnZhbGlkYXRlUmVjdDE2KCBoV25kLCBOVUxMLCBUUlVFICk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBXTV9TWVNDT0xPUkNIQU5HRToKQEAgLTM2OSw1NyArMzcwLDcwIEBACiAKIHN0YXRpYyB2b2lkIENCX1BhaW50KCBXTkQgKnduZFB0ciwgSERDMzIgaERDLCBXT1JEIGFjdGlvbiApCiB7Ci0gICAgUkVDVDE2IHJjOworICAgIFJFQ1QxNiByYm94LCBydGV4dCwgY2xpZW50OwogICAgIEhCUlVTSDE2IGhCcnVzaDsKLSAgICBpbnQgdGV4dGxlbiwgZGVsdGEsIHgsIHk7Ci0gICAgVEVYVE1FVFJJQzE2IHRtOworICAgIGludCB0ZXh0bGVuLCBkZWx0YTsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKIAotICAgIEdldENsaWVudFJlY3QxNih3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworICAgIHRleHRsZW4gPSAwOworICAgIEdldENsaWVudFJlY3QxNih3bmRQdHItPmh3bmRTZWxmLCAmY2xpZW50KTsKKyAgICByYm94ID0gcnRleHQgPSBjbGllbnQ7CiAKICAgICBpZiAoaW5mb1B0ci0+aEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoREMsIGluZm9QdHItPmhGb250ICk7CiAgICAgaEJydXNoID0gQlVUVE9OX1NFTkRfQ1RMQ09MT1IoIHduZFB0ciwgaERDICk7Ci0gICAgaWYgKGFjdGlvbiA9PSBPREFfRFJBV0VOVElSRSkgRmlsbFJlY3QxNiggaERDLCAmcmMsIGhCcnVzaCApOworICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBCU19MRUZUVEVYVCkgCisgICAgeworCS8qIG1hZ2ljICs0IGlzIHdoYXQgQ1RMM0QgZXhwZWN0cyAqLwogCi0gICAgR2V0VGV4dE1ldHJpY3MxNihoREMsICZ0bSk7Ci0gICAgZGVsdGEgPSAocmMuYm90dG9tIC0gcmMudG9wIC0gdG0udG1IZWlnaHQpID4+IDE7CisgICAgICAgIHJ0ZXh0LnJpZ2h0IC09IGNoZWNrQm94V2lkdGggKyA0OworICAgICAgICByYm94LmxlZnQgPSByYm94LnJpZ2h0IC0gY2hlY2tCb3hXaWR0aDsKKyAgICB9CisgICAgZWxzZSAKKyAgICB7CisgICAgICAgIHJ0ZXh0LmxlZnQgKz0gY2hlY2tCb3hXaWR0aCArIDQ7CisgICAgICAgIHJib3gucmlnaHQgPSBjaGVja0JveFdpZHRoOworICAgIH0KIAogICAgICAgLyogRHJhdyB0aGUgY2hlY2stYm94IGJpdG1hcCAqLwotICAgIHggPSB5ID0gMDsKLSAgICBpZiAoaW5mb1B0ci0+c3RhdGUgJiBCVVRUT05fSElHSExJR0hURUQpIHggKz0gMiAqIGNoZWNrQm94V2lkdGg7Ci0gICAgaWYgKGluZm9QdHItPnN0YXRlICYgKEJVVFRPTl9DSEVDS0VEIHwgQlVUVE9OXzNTVEFURSkpIHggKz0gY2hlY2tCb3hXaWR0aDsKLSAgICBpZiAoKCh3bmRQdHItPmR3U3R5bGUgJiAweDBmKSA9PSBCU19SQURJT0JVVFRPTikgfHwKLSAgICAgICAgKCh3bmRQdHItPmR3U3R5bGUgJiAweDBmKSA9PSBCU19BVVRPUkFESU9CVVRUT04pKSB5ICs9IGNoZWNrQm94SGVpZ2h0OwotICAgIGVsc2UgaWYgKGluZm9QdHItPnN0YXRlICYgQlVUVE9OXzNTVEFURSkgeSArPSAyICogY2hlY2tCb3hIZWlnaHQ7Ci0gICAgR1JBUEhfRHJhd0JpdG1hcCggaERDLCBoYml0bWFwQ2hlY2tCb3hlcywgcmMubGVmdCwgcmMudG9wICsgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgeCwgeSwgY2hlY2tCb3hXaWR0aCwgY2hlY2tCb3hIZWlnaHQgKTsKLSAgICByYy5sZWZ0ICs9IGNoZWNrQm94V2lkdGggKyB0bS50bUF2ZUNoYXJXaWR0aCAvIDI7CiAKLSAgICBpZiAoIXduZFB0ci0+dGV4dCkgcmV0dXJuOwotICAgIHRleHRsZW4gPSBzdHJsZW4oIHduZFB0ci0+dGV4dCApOworICAgIGlmICh3bmRQdHItPnRleHQpIHRleHRsZW4gPSBzdHJsZW4oIHduZFB0ci0+dGV4dCApOworICAgIGlmIChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUgfHwgYWN0aW9uID09IE9EQV9TRUxFQ1QpCisgICAgeyAKKyAgICAgICAgaW50IHggPSAwLCB5ID0gMDsKKyAgICAgICAgZGVsdGEgPSAocmJveC5ib3R0b20gLSByYm94LnRvcCAtIGNoZWNrQm94SGVpZ2h0KSA+PiAxOwogCi0gICAgaWYgKGFjdGlvbiA9PSBPREFfRFJBV0VOVElSRSkKLSAgICB7Ci0gICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKLSAgICAgICAgICAgIFNldFRleHRDb2xvciggaERDLCBHZXRTeXNDb2xvcihDT0xPUl9HUkFZVEVYVCkgKTsKLSAgICAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIHRleHRsZW4sICZyYywKLSAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVIgfCBEVF9OT0NMSVAgKTsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBPREFfU0VMRUNUKSBGaWxsUmVjdDE2KCBoREMsICZyYm94LCBoQnJ1c2ggKTsKKyAgICAgICAgZWxzZSBGaWxsUmVjdDE2KCBoREMsICZjbGllbnQsIGhCcnVzaCApOworCisgICAgICAgIGlmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9ISUdITElHSFRFRCkgeCArPSAyICogY2hlY2tCb3hXaWR0aDsKKyAgICAgICAgaWYgKGluZm9QdHItPnN0YXRlICYgKEJVVFRPTl9DSEVDS0VEIHwgQlVUVE9OXzNTVEFURSkpIHggKz0gY2hlY2tCb3hXaWR0aDsKKyAgICAgICAgaWYgKCgod25kUHRyLT5kd1N0eWxlICYgMHgwZikgPT0gQlNfUkFESU9CVVRUT04pIHx8CisgICAgICAgICAgICAoKHduZFB0ci0+ZHdTdHlsZSAmIDB4MGYpID09IEJTX0FVVE9SQURJT0JVVFRPTikpIHkgKz0gY2hlY2tCb3hIZWlnaHQ7CisgICAgICAgIGVsc2UgaWYgKGluZm9QdHItPnN0YXRlICYgQlVUVE9OXzNTVEFURSkgeSArPSAyICogY2hlY2tCb3hIZWlnaHQ7CisKKyAgICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaERDLCBoYml0bWFwQ2hlY2tCb3hlcywgcmJveC5sZWZ0LCByYm94LnRvcCArIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCBjaGVja0JveFdpZHRoLCBjaGVja0JveEhlaWdodCApOworICAgICAgICBpZiggdGV4dGxlbiAmJiBhY3Rpb24gIT0gT0RBX1NFTEVDVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhEQywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpICk7CisgICAgICAgICAgICBEcmF3VGV4dDE2KCBoREMsIHduZFB0ci0+dGV4dCwgdGV4dGxlbiwgJnJ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgRFRfU0lOR0xFTElORSB8IERUX1ZDRU5URVIgKTsKKyAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGlmICgoYWN0aW9uID09IE9EQV9GT0NVUykgfHwKICAgICAgICAgKChhY3Rpb24gPT0gT0RBX0RSQVdFTlRJUkUpICYmIChpbmZvUHRyLT5zdGF0ZSAmIEJVVFRPTl9IQVNGT0NVUykpKQogICAgIHsKLSAgICAgICAgUkVDVDE2IHJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKLSAgICAgICAgRHJhd1RleHQxNiggaERDLCB3bmRQdHItPnRleHQsIHRleHRsZW4sICZyZWN0LAotICAgICAgICAgICAgICAgICAgICBEVF9TSU5HTEVMSU5FIHwgRFRfQ0FMQ1JFQ1QgKTsKLSAgICAgICAgaWYgKGRlbHRhID4gMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmMudG9wICs9IGRlbHRhIC0gMTsKLSAgICAgICAgICAgIHJjLmJvdHRvbSAtPSBkZWx0YSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmMubGVmdC0tOwotICAgICAgICByYy5yaWdodCA9IHJjLmxlZnQgKyByZWN0LnJpZ2h0ICsgMjsKLSAgICAgICAgRHJhd0ZvY3VzUmVjdDE2KCBoREMsICZyYyApOworCS8qIGFnYWluLCB0aGlzIGlzIHdoYXQgQ1RMM0QgZXhwZWN0cyAqLworCisgICAgICAgIERXT1JEIHRtID0gKHRleHRsZW4pID8gR2V0VGV4dEV4dGVudCggaERDLCB3bmRQdHItPnRleHQsIHRleHRsZW4pIDogMHgwMDAyMDAwMjsKKyAgICAgICAgZGVsdGEgPSAocnRleHQuYm90dG9tIC0gcnRleHQudG9wIC0gSElXT1JEKHRtKSAtIDEpLzI7CisKKyAgICAgICAgcmJveC5ib3R0b20gPSAocmJveC50b3AgPSBydGV4dC50b3AgKyBkZWx0YSAtIDEpICsgSElXT1JEKHRtKSArIDI7CisgICAgICAgIHJib3gucmlnaHQgPSAocmJveC5sZWZ0ID0gLS1ydGV4dC5sZWZ0KSArIExPV09SRCh0bSkgKyAyOworICAgICAgICBJbnRlcnNlY3RSZWN0MTYoJnJib3gsICZyYm94LCAmcnRleHQpOworICAgICAgICBEcmF3Rm9jdXNSZWN0MTYoIGhEQywgJnJib3ggKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDQzYTM2OGIuLjRjMjMxZjQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtMTIzMyw2OCArMTIzMywzIEBACiAgICAgfQogICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogfQotCi0KLXN0YXRpYyBJTlQzMiBDT01CT19EbGdEaXJMaXN0KCBIV05EMzIgaERsZywgTFBBUkFNIHBhdGgsIElOVDMyIGlkQ0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBpZFN0YXRpYywgVUlOVDMyIHdUeXBlLCBCT09MMzIgdW5pY29kZSApCi17Ci0gICAgTFJFU1VMVCByZXMgPSAwOwotCi0gICAgaWYgKGlkQ0JveCkKLSAgICB7Ci0gICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZTMyQSggaERsZywgaWRDQm94LCBDQl9SRVNFVENPTlRFTlQxNiwgMCwgMCApOwotICAgICAgICBpZiAodW5pY29kZSkKLSAgICAgICAgICAgIHJlcyA9IFNlbmREbGdJdGVtTWVzc2FnZTMyVyggaERsZywgaWRDQm94LCBDQl9ESVIxNiwgd1R5cGUsIHBhdGggKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzID0gU2VuZERsZ0l0ZW1NZXNzYWdlMzJBKCBoRGxnLCBpZENCb3gsIENCX0RJUjE2LCB3VHlwZSwgcGF0aCApOwotICAgIH0KLSAgICBpZiAoaWRTdGF0aWMpCi0gICAgewotICAgICAgICBjaGFyIHRlbXBbNTEyXSA9ICJBOlxcIjsKLSAgICAgICAgaW50IGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7Ci0gICAgICAgIHRlbXBbMF0gKz0gZHJpdmU7Ci0gICAgICAgIGxzdHJjcHluMzJBKCB0ZW1wICsgMywgRFJJVkVfR2V0RG9zQ3dkKGRyaXZlKSwgc2l6ZW9mKHRlbXApLTMgKTsKLSAgICAgICAgQW5zaUxvd2VyKCB0ZW1wICk7Ci0gICAgICAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoRGxnLCBpZFN0YXRpYywgdGVtcCApOwotICAgIH0gCi0gICAgcmV0dXJuIChyZXMgPj0gMCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGxnRGlyTGlzdENvbWJvQm94MTYgICAoVVNFUi4xOTUpCi0gKi8KLUlOVDE2IERsZ0Rpckxpc3RDb21ib0JveDE2KCBIV05EMTYgaERsZywgU0VHUFRSIHBhdGgsIElOVDE2IGlkQ0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBpZFN0YXRpYywgVUlOVDE2IHdUeXBlICkKLXsKLSAgICBkcHJpbnRmX2NvbWJvKCBzdGRkZWIsIkRsZ0Rpckxpc3RDb21ib0JveDE2KCUwNHgsJTA4eCwlZCwlZCwlMDR4KVxuIiwKLSAgICAgICAgICAgICAgICAgICBoRGxnLCAoVUlOVDMyKXBhdGgsIGlkQ0JveCwgaWRTdGF0aWMsIHdUeXBlICk7Ci0gICAgcmV0dXJuIENPTUJPX0RsZ0Rpckxpc3QoIGhEbGcsIChMUEFSQU0pcGF0aCwgaWRDQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN0YXRpYywgd1R5cGUsIEZBTFNFICk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRGxnRGlyTGlzdENvbWJvQm94MzJBICAgKFVTRVIzMi4xNDMpCi0gKi8KLUlOVDMyIERsZ0Rpckxpc3RDb21ib0JveDMyQSggSFdORDMyIGhEbGcsIExQQ1NUUiBwYXRoLCBJTlQzMiBpZENCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGlkU3RhdGljLCBVSU5UMzIgd1R5cGUgKQotewotICAgIGRwcmludGZfY29tYm8oIHN0ZGRlYiwiRGxnRGlyTGlzdENvbWJvQm94MzJBKCUwOHgsJyVzJywlZCwlZCwlMDhYKVxuIiwKLSAgICAgICAgICAgICAgICAgICBoRGxnLCBwYXRoLCBpZENCb3gsIGlkU3RhdGljLCB3VHlwZSApOwotICAgIHJldHVybiBDT01CT19EbGdEaXJMaXN0KCBoRGxnLCAoTFBBUkFNKXBhdGgsIGlkQ0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTdGF0aWMsIHdUeXBlLCBGQUxTRSApOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERsZ0Rpckxpc3RDb21ib0JveDMyVyAgIChVU0VSMzIuMTQ0KQotICovCi1JTlQzMiBEbGdEaXJMaXN0Q29tYm9Cb3gzMlcoIEhXTkQzMiBoRGxnLCBMUENXU1RSIHBhdGgsIElOVDMyIGlkQ0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaWRTdGF0aWMsIFVJTlQzMiB3VHlwZSApCi17Ci0gICAgZHByaW50Zl9jb21ibyggc3RkZGViLCJEbGdEaXJMaXN0Q29tYm9Cb3gzMlcoJTA4eCwlcCwlZCwlZCwlMDhYKVxuIiwKLSAgICAgICAgICAgICAgICAgICBoRGxnLCBwYXRoLCBpZENCb3gsIGlkU3RhdGljLCB3VHlwZSApOwotICAgIHJldHVybiBDT01CT19EbGdEaXJMaXN0KCBoRGxnLCAoTFBBUkFNKXBhdGgsIGlkQ0JveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTdGF0aWMsIHdUeXBlLCBUUlVFICk7Ci19CmRpZmYgLS1naXQgYS9jb250cm9scy9kZXNrdG9wLmMgYi9jb250cm9scy9kZXNrdG9wLmMKaW5kZXggODdjZGU4NS4uYjc0NThiOSAxMDA2NDQKLS0tIGEvY29udHJvbHMvZGVza3RvcC5jCisrKyBiL2NvbnRyb2xzL2Rlc2t0b3AuYwpAQCAtMTczLDcgKzE3Myw3IEBACiBCT09MMTYgU2V0RGVza1BhdHRlcm4odm9pZCkKIHsKICAgICBjaGFyIGJ1ZmZlclsxMDBdOwotICAgIEdldFByb2ZpbGVTdHJpbmcoICJkZXNrdG9wIiwgIlBhdHRlcm4iLCAiKE5vbmUpIiwgYnVmZmVyLCAxMDAgKTsKKyAgICBHZXRQcm9maWxlU3RyaW5nMzJBKCAiZGVza3RvcCIsICJQYXR0ZXJuIiwgIihOb25lKSIsIGJ1ZmZlciwgMTAwICk7CiAgICAgcmV0dXJuIERFU0tUT1BfU2V0UGF0dGVybiggYnVmZmVyICk7CiB9CiAKQEAgLTIwMiw3ICsyMDIsNyBAQAogCiAgICAgaWYgKGZpbGVuYW1lID09IChMUFNUUiktMSkKICAgICB7Ci0JR2V0UHJvZmlsZVN0cmluZyggImRlc2t0b3AiLCAiV2FsbFBhcGVyIiwgIihOb25lKSIsIGJ1ZmZlciwgMjU2ICk7CisJR2V0UHJvZmlsZVN0cmluZzMyQSggImRlc2t0b3AiLCAiV2FsbFBhcGVyIiwgIihOb25lKSIsIGJ1ZmZlciwgMjU2ICk7CiAJZmlsZW5hbWUgPSBidWZmZXI7CiAgICAgfQogICAgIGhkYyA9IEdldERDMzIoIDAgKTsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIFJlbGVhc2VEQzMyKCAwLCBoZGMgKTsKICAgICBpZiAoaW5mb1B0ci0+aGJpdG1hcFdhbGxQYXBlcikgRGVsZXRlT2JqZWN0MzIoIGluZm9QdHItPmhiaXRtYXBXYWxsUGFwZXIgKTsKICAgICBpbmZvUHRyLT5oYml0bWFwV2FsbFBhcGVyID0gaGJpdG1hcDsKLSAgICBpbmZvUHRyLT5mVGlsZVdhbGxQYXBlciA9IEdldFByb2ZpbGVJbnQoICJkZXNrdG9wIiwgIlRpbGVXYWxsUGFwZXIiLCAwICk7CisgICAgaW5mb1B0ci0+ZlRpbGVXYWxsUGFwZXIgPSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsICJUaWxlV2FsbFBhcGVyIiwgMCApOwogICAgIGlmIChoYml0bWFwKQogICAgIHsKIAlCSVRNQVAzMiBibXA7CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggYTA3NjQ1ZC4uYmFkODZhNyAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtMSwyMjY5ICsxLDIzOTMgQEAKIC8qCiAgKiBMaXN0Ym94IGNvbnRyb2xzCi0gKiAKLSAqIENvcHlyaWdodCAgTWFydGluIEF5b3R0ZSwgMTk5MwotICogICAgICAgICAgICBDb25zdGFudGluZSBTYXB1bnR6YWtpcywgMTk5NQotICogCSAgICAgIEFsZXggS29yb2JrYSwgMTk5NSwgMTk5NiAKLSAqIAorICoKKyAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSAvKgotICAqIEZJWE1FOiAKLSAgKiAtIHByb3BlciBzY3JvbGxpbmcgZm9yIG11bHRpY29sdW1uIHN0eWxlCi0gICogLSBhbmNob3IgYW5kIGNhcmV0IGZvciBMQlNfRVhURU5ERURTRUwKLSAgKiAtIHByb3BlciBzZWxlY3Rpb24gd2l0aCBrZXlib2FyZAotICAqIC0gaG93IHRvIGhhbmRsZSAoTEJTX0VYVEVOREVEU0VMIHwgTEJTX01VTFRJUExFU0VMKSBzdHlsZQotICAqIC0gc3VwcG9ydCBmb3IgTEJTX05PSU5URUdSQUxIRUlHSFQgYW5kIExCU19PV05FUkRSQVdWQVJJQUJMRSBzdHlsZXMKLSAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMgIC8qIFRoaXMgZmlsZSBpcyBXaW4zMi1jbGVhbiAqLwogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luLmgiCi0jaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAibXNkb3MuaCIKLSNpbmNsdWRlICJsaXN0Ym94LmgiCi0jaW5jbHVkZSAiZG9zX2ZzLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKLSNpbmNsdWRlICJmaWxlLmgiCisjaW5jbHVkZSAiZG9zX2ZzLmgiCisjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAic3B5LmgiCisjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKIAotI2RlZmluZSBMSVNUX0hFQVBfQUxMT0MobHBobCxmLHNpemUpIFwKLSAgICBMT0NBTF9BbGxvYyggbHBobC0+SGVhcFNlbCwgTE1FTV9GSVhFRCwgKHNpemUpICkKLSNkZWZpbmUgTElTVF9IRUFQX0ZSRUUobHBobCxoYW5kbGUpIFwKLSAgICBMT0NBTF9GcmVlKCBscGhsLT5IZWFwU2VsLCAoaGFuZGxlKSApCi0jZGVmaW5lIExJU1RfSEVBUF9BRERSKGxwaGwsaGFuZGxlKSAgXAotICAgICgoaGFuZGxlKSA/IFBUUl9TRUdfT0ZGX1RPX0xJTihscGhsLT5IZWFwU2VsLCAoaGFuZGxlKSkgOiBOVUxMKQorLyogVW5pbXBsZW1lbnRlZCB5ZXQ6CisgKiAtIExCU19OT1NFTAorICogLSBMQlNfVVNFVEFCU1RPUFMKKyAqIC0gVW5pY29kZQorICogLSBMb2NhbGUgaGFuZGxpbmcKKyAqIC0gQ09NQk9MQk9YCisgKi8KIAotI2RlZmluZSBMSVNUX0hFQVBfU0laRSAweDEwMDAwCisvKiBJdGVtcyBhcnJheSBncmFudWxhcml0eSAqLworI2RlZmluZSBMQl9BUlJBWV9HUkFOVUxBUklUWSAxNgogCi0jZGVmaW5lIExCTU1fRURHRSAgIDQgICAgLyogZGlzdGFuY2UgaW5zaWRlIGJveCB3aGljaCBpcyBzYW1lIGFzIG1vdmluZyBtb3VzZQotCQkJICAgIG91dHNpZGUgYm94LCB0byB0cmlnZ2VyIHNjcm9sbGluZyBvZiBMQiAqLworLyogU2Nyb2xsaW5nIHRpbWVvdXQgaW4gbXMgKi8KKyNkZWZpbmUgTEJfU0NST0xMX1RJTUVPVVQgNTAKIAotI2RlZmluZSBNQVRDSF9TVUJTVFIgICAgICAgICAgICAyCi0jZGVmaW5lIE1BVENIX0VYQUNUICAgICAgICAgICAgIDEKLSNkZWZpbmUgTUFUQ0hfTkVBUkVTVCAgICAgICAgICAgMAorLyogTGlzdGJveCBzeXN0ZW0gdGltZXIgaWQgKi8KKyNkZWZpbmUgTEJfVElNRVJfSUQgIDIKIAotc3RhdGljIHZvaWQgTGlzdEJveEluaXRpYWxpemUoTFBIRUFETElTVCBscGhsKQorLyogSXRlbSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0CiB7Ci0gIGxwaGwtPmxwRmlyc3QgICAgICAgID0gTlVMTDsKLSAgbHBobC0+SXRlbXNDb3VudCAgICAgPSAwOwotICBscGhsLT5JdGVtc1Zpc2libGUgICA9IDA7Ci0gIGxwaGwtPkZpcnN0VmlzaWJsZSAgID0gMDsKLSAgbHBobC0+Q29sdW1uc1Zpc2libGUgPSAxOwotICBscGhsLT5JdGVtc1BlckNvbHVtbiA9IDA7Ci0gIGxwaGwtPkl0ZW1Gb2N1c2VkICAgID0gLTE7Ci0gIGxwaGwtPlByZXZGb2N1c2VkICAgID0gLTE7Ci19CisgICAgTFBTVFIgICAgIHN0cjsgICAgICAgLyogSXRlbSB0ZXh0ICovCisgICAgQk9PTDMyICAgIHNlbGVjdGVkOyAgLyogSXMgaXRlbSBzZWxlY3RlZD8gKi8KKyAgICBVSU5UMzIgICAgaGVpZ2h0OyAgICAvKiBJdGVtIGhlaWdodCAob25seSBmb3IgT1dORVJEUkFXVkFSSUFCTEUpICovCisgICAgRFdPUkQgICAgIGRhdGE7ICAgICAgLyogVXNlciBkYXRhICovCit9IExCX0lURU1EQVRBOwogCi12b2lkIENyZWF0ZUxpc3RCb3hTdHJ1Y3QoSFdORCBod25kLCBXT1JEIEN0bFR5cGUsIExPTkcgc3R5bGVzLCBIV05EIHBhcmVudCkKKy8qIExpc3Rib3ggc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIEhEQzMyICAgICAgICAgaGRjOworICAgIEhBTkRMRTMyICAgICAgaGVhcDsgICAgICAgICAgIC8qIEhlYXAgZm9yIHRoaXMgbGlzdGJveCAqLworICAgIEhXTkQzMiAgICAgICAgb3duZXI7ICAgICAgICAgIC8qIE93bmVyIHdpbmRvdyAqLworICAgIFVJTlQzMiAgICAgICAgc3R5bGU7ICAgICAgICAgIC8qIFdpbmRvdyBzdHlsZSAqLworICAgIElOVDMyICAgICAgICAgd2lkdGg7ICAgICAgICAgIC8qIFdpbmRvdyB3aWR0aCAqLworICAgIElOVDMyICAgICAgICAgaGVpZ2h0OyAgICAgICAgIC8qIFdpbmRvdyBoZWlnaHQgKi8KKyAgICBMQl9JVEVNREFUQSAgKml0ZW1zOyAgICAgICAgICAvKiBBcnJheSBvZiBpdGVtcyAqLworICAgIElOVDMyICAgICAgICAgbmJfaXRlbXM7ICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyAqLworICAgIElOVDMyICAgICAgICAgdG9wX2l0ZW07ICAgICAgIC8qIFRvcCB2aXNpYmxlIGl0ZW0gKi8KKyAgICBJTlQzMiAgICAgICAgIHNlbGVjdGVkX2l0ZW07ICAvKiBTZWxlY3RlZCBpdGVtICovCisgICAgSU5UMzIgICAgICAgICBmb2N1c19pdGVtOyAgICAgLyogSXRlbSB0aGF0IGhhcyB0aGUgZm9jdXMgKi8KKyAgICBJTlQzMiAgICAgICAgIGFuY2hvcl9pdGVtOyAgICAvKiBBbmNob3IgaXRlbSBmb3IgZXh0ZW5kZWQgc2VsZWN0aW9uICovCisgICAgSU5UMzIgICAgICAgICBpdGVtX2hlaWdodDsgICAgLyogRGVmYXVsdCBpdGVtIGhlaWdodCAqLworICAgIElOVDMyICAgICAgICAgcGFnZV9zaXplOyAgICAgIC8qIEl0ZW1zIHBlciBsaXN0Ym94IHBhZ2UgKi8KKyAgICBJTlQzMiAgICAgICAgIGNvbHVtbl93aWR0aDsgICAvKiBDb2x1bW4gd2lkdGggZm9yIG11bHRpLWNvbHVtbiBsaXN0Ym94ZXMgKi8KKyAgICBJTlQzMiAgICAgICAgIGhvcnpfZXh0ZW50OyAgICAvKiBIb3Jpem9udGFsIGV4dGVudCAoMCBpZiBubyBoc2Nyb2xsKSAqLworICAgIElOVDMyICAgICAgICAgaG9yel9wb3M7ICAgICAgIC8qIEhvcml6b250YWwgcG9zaXRpb24gKi8KKyAgICBJTlQzMiAgICAgICAgIG5iX3RhYnM7ICAgICAgICAvKiBOdW1iZXIgb2YgdGFicyBpbiBhcnJheSAqLworICAgIElOVDMyICAgICAgICAqdGFiczsgICAgICAgICAgIC8qIEFycmF5IG9mIHRhYnMgKi8KKyAgICBCT09MMzIgICAgICAgIGNhcmV0X29uOyAgICAgICAvKiBJcyBjYXJldCBvbj8gKi8KKyAgICBIRk9OVDMyICAgICAgIGZvbnQ7ICAgICAgICAgICAvKiBDdXJyZW50IGZvbnQgKi8KKyAgICBMQ0lEICAgICAgICAgIGxvY2FsZTsgICAgICAgICAvKiBDdXJyZW50IGxvY2FsZSBmb3Igc3RyaW5nIGNvbXBhcmlzb25zICovCit9IExCX0RFU0NSOwogCi0gIGxwaGwgPSAoTFBIRUFETElTVCl4bWFsbG9jKHNpemVvZihIRUFETElTVCkpOwotICBTZXRXaW5kb3dMb25nMzJBKGh3bmQsIDAsIChMT05HKWxwaGwpOwotICBMaXN0Qm94SW5pdGlhbGl6ZShscGhsKTsKLSAgbHBobC0+RHJhd0N0bFR5cGUgICAgPSBDdGxUeXBlOwotICBscGhsLT5DdGxJRCAgICAgICAgICA9IEdldFdpbmRvd1dvcmQoaHduZCxHV1dfSUQpOwotICBscGhsLT5iUmVkcmF3RmxhZyAgICA9IFRSVUU7Ci0gIGxwaGwtPmlOdW1TdG9wcyAgICAgID0gMDsKLSAgbHBobC0+VGFiU3RvcHMgICAgICAgPSBOVUxMOwotICBscGhsLT5oRm9udCAgICAgICAgICA9IEdldFN0b2NrT2JqZWN0MzIoU1lTVEVNX0ZPTlQpOwotICBscGhsLT5oU2VsZiAgICAgICAgICA9IGh3bmQ7ICAKLSAgaWYgKEN0bFR5cGU9PU9EVF9DT01CT0JPWCkgICAgICAgICAgICAgIC8qIHVzZSB0aGUgImZha2VkIiBzdHlsZSBmb3IgQ09NQk9MQk9YICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMQlNfU09SVCBpbnN0ZWFkIENCU19TT1JUIGUuZy4gICAgICAqLwotICAgIGxwaGwtPmR3U3R5bGUgICA9IE1BS0VMT05HKExPV09SRChzdHlsZXMpLEhJV09SRChHZXRXaW5kb3dMb25nMzJBKGh3bmQsR1dMX1NUWUxFKSkpOwotICBlbHNlCi0gICAgbHBobC0+ZHdTdHlsZSAgID0gR2V0V2luZG93TG9uZzMyQShod25kLEdXTF9TVFlMRSk7IC8qIHVzZSBvcmlnaW5hbCBzdHlsZSBkd29yZCAqLwotICBscGhsLT5oUGFyZW50ICAgICAgICA9IHBhcmVudDsKLSAgbHBobC0+U3RkSXRlbUhlaWdodCAgPSAxNTsgLyogRklYTUU6IHNob3VsZCBnZXQgdGhlIGZvbnQgaGVpZ2h0ICovCi0gIGxwaGwtPk93bmVyRHJhd24gICAgID0gc3R5bGVzICYgKExCU19PV05FUkRSQVdGSVhFRCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSk7Ci0gIGxwaGwtPkhhc1N0cmluZ3MgICAgID0gKHN0eWxlcyAmIExCU19IQVNTVFJJTkdTKSB8fCAhbHBobC0+T3duZXJEcmF3bjsKIAotICAvKiBjcmVhdGUgZHVtbXkgaGRjIHRvIHNldCB0ZXh0IGhlaWdodCAqLwotICBpZiAoKGhkYyA9IEdldERDMzIoMCkpKQotICB7Ci0gICAgICBURVhUTUVUUklDMTYgdG07Ci0gICAgICBHZXRUZXh0TWV0cmljczE2KCBoZGMsICZ0bSApOwotICAgICAgbHBobC0+U3RkSXRlbUhlaWdodCA9IHRtLnRtSGVpZ2h0OwotICAgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiQ3JlYXRlTGlzdEJveFN0cnVjdDogIGZvbnQgaGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQpOwotICAgICAgUmVsZWFzZURDMzIoIDAsIGhkYyApOwotICB9CisjZGVmaW5lIElTX09XTkVSRFJBVyhkZXNjcikgXAorICAgICgoZGVzY3IpLT5zdHlsZSAmIChMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKQogCi0gIGlmIChscGhsLT5Pd25lckRyYXduKQotICB7Ci0gICAgTElTVFNUUlVDVCBkdW1teWxzOwotICAgIAotICAgIGxwaGwtPm5lZWRNZWFzdXJlID0gVFJVRTsKLSAgICBkdW1teWxzLm1pcy5DdGxUeXBlICAgID0gbHBobC0+RHJhd0N0bFR5cGU7Ci0gICAgZHVtbXlscy5taXMuQ3RsSUQgICAgICA9IGxwaGwtPkN0bElEOwotICAgIGR1bW15bHMubWlzLml0ZW1JRCAgICAgPSAtMTsKLSAgICBkdW1teWxzLm1pcy5pdGVtV2lkdGggID0gMDsgLyogaWdub3JlZCAqLwotICAgIGR1bW15bHMubWlzLml0ZW1EYXRhICAgPSAwOworI2RlZmluZSBIQVNfU1RSSU5HUyhkZXNjcikgXAorICAgICghSVNfT1dORVJEUkFXKGRlc2NyKSB8fCAoKGRlc2NyKS0+c3R5bGUgJiBMQlNfSEFTU1RSSU5HUykpCiAKLSAgICBMaXN0Qm94QXNrTWVhc3VyZShscGhsLCZkdW1teWxzKTsKLSAgfQorI2RlZmluZSBTRU5EX05PVElGSUNBVElPTih3bmQsZGVzY3IsY29kZSkgXAorICAgIChTZW5kTWVzc2FnZTMyQSggKGRlc2NyKS0+b3duZXIsIFdNX0NPTU1BTkQsIFwKKyAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oICh3bmQpLT53SURtZW51LCAoY29kZSkgKSwgKHduZCktPmh3bmRTZWxmICkpCiAKLSAgbHBobC0+SGVhcFNlbCA9IEdsb2JhbEFsbG9jMTYoR01FTV9GSVhFRCxMSVNUX0hFQVBfU0laRSk7Ci0gIExvY2FsSW5pdCggbHBobC0+SGVhcFNlbCwgMCwgTElTVF9IRUFQX1NJWkUtMSk7Ci19Ci0KLXZvaWQgRGVzdHJveUxpc3RCb3hTdHJ1Y3QoTFBIRUFETElTVCBscGhsKQorLyogQ3VycmVudCB0aW1lciBzdGF0dXMgKi8KK3R5cGVkZWYgZW51bQogewotICAvKiBYWFggbmVlZCB0byBmcmVlIGxwaGwtPkhlYXAgKi8KLSAgR2xvYmFsRnJlZTE2KGxwaGwtPkhlYXBTZWwpOwotICBmcmVlKGxwaGwpOwotfQorICAgIExCX1RJTUVSX05PTkUsCisgICAgTEJfVElNRVJfVVAsCisgICAgTEJfVElNRVJfTEVGVCwKKyAgICBMQl9USU1FUl9ET1dOLAorICAgIExCX1RJTUVSX1JJR0hUCit9IFRJTUVSX0RJUkVDVElPTjsKIAotc3RhdGljIExQSEVBRExJU1QgTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoSFdORCBod25kKQorc3RhdGljIFRJTUVSX0RJUkVDVElPTiBMSVNUQk9YX1RpbWVyID0gTEJfVElNRVJfTk9ORTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0R1bXAKKyAqLwordm9pZCBMSVNUQk9YX0R1bXAoIFdORCAqd25kICkKIHsKLSAgICByZXR1cm4gKExQSEVBRExJU1QpR2V0V2luZG93TG9uZzMyQShod25kLDApOwotfQorICAgIElOVDMyIGk7CisgICAgTEJfSVRFTURBVEEgKml0ZW07CisgICAgTEJfREVTQ1IgKmRlc2NyID0gKihMQl9ERVNDUiAqKil3bmQtPndFeHRyYTsKIAotLyogU2VuZCBub3RpZmljYXRpb24gImNvZGUiIGFzIHBhcnQgb2YgYSBXTV9DT01NQU5ELW1lc3NhZ2UgaWYgaHduZAotICAgaGFzIHRoZSBMQlNfTk9USUZZIHN0eWxlICovCi12b2lkIExpc3RCb3hTZW5kTm90aWZpY2F0aW9uKExQSEVBRExJU1QgbHBobCwgV09SRCBjb2RlKQotewotICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19OT1RJRlkpCi0gICAgICBTZW5kTWVzc2FnZTMyQSggbHBobC0+aFBhcmVudCwgV01fQ09NTUFORCwKLSAgICAgICAgICAgICAgICAgICAgICBNQUtFV1BBUkFNKCBscGhsLT5DdGxJRCwgY29kZSksIChMUEFSQU0pbHBobC0+aFNlbGYgKTsKLX0KLQotCi0vKiBnZXQgdGhlIG1heGltdW0gdmFsdWUgb2YgbHBobC0+Rmlyc3RWaXNpYmxlICovCi1pbnQgTGlzdE1heEZpcnN0VmlzaWJsZShMUEhFQURMSVNUIGxwaGwpCi17Ci0gICAgaW50IG0gPSBscGhsLT5JdGVtc0NvdW50LWxwaGwtPkl0ZW1zVmlzaWJsZTsKLSAgICByZXR1cm4gKG0gPCAwKSA/IDAgOiBtOwotfQotCi0KLXZvaWQgTGlzdEJveFVwZGF0ZVdpbmRvdyhIV05EIGh3bmQsIExQSEVBRExJU1QgbHBobCwgQk9PTCByZXBhaW50KQotewotICBpZiAobHBobC0+ZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpCi0gICAgU2V0U2Nyb2xsUmFuZ2UzMihod25kLCBTQl9WRVJULCAwLCBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpLCBUUlVFKTsKLSAgaWYgKChscGhsLT5kd1N0eWxlICYgV1NfSFNDUk9MTCkgJiYgKGxwaGwtPkl0ZW1zUGVyQ29sdW1uICE9IDApKQotICAgIFNldFNjcm9sbFJhbmdlMzIoaHduZCwgU0JfSE9SWiwgMSwgbHBobC0+SXRlbXNWaXNpYmxlIC8KLQkJICAgbHBobC0+SXRlbXNQZXJDb2x1bW4gKyAxLCBUUlVFKTsKLQotICBpZiAocmVwYWludCAmJiBscGhsLT5iUmVkcmF3RmxhZykgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotfQotCi0vKiBSZXR1cm5zOiAwIGlmIG5vdGhpbmcgbmVlZHMgdG8gYmUgY2hhbmdlZCAqLwotLyogICAgICAgICAgMSBpZiBGaXJzdFZpc2libGUgY2hhbmdlZCAqLwotCi1pbnQgTGlzdEJveFNjcm9sbFRvRm9jdXMoTFBIRUFETElTVCBscGhsKQotewotICBzaG9ydCAgICAgICBlbmQ7Ci0KLSAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIDA7Ci0gIGlmIChscGhsLT5JdGVtRm9jdXNlZCA9PSAtMSkgcmV0dXJuIDA7Ci0KLSAgZW5kID0gbHBobC0+Rmlyc3RWaXNpYmxlICsgbHBobC0+SXRlbXNWaXNpYmxlIC0gMTsKLQotICBpZiAobHBobC0+SXRlbUZvY3VzZWQgPCBscGhsLT5GaXJzdFZpc2libGUgKSB7Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQ7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkID4gZW5kKSB7Ci0gICAgICBXT1JEIG1heEZpcnN0VmlzaWJsZSA9IExpc3RNYXhGaXJzdFZpc2libGUobHBobCk7Ci0KLSAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotICAgICAgCi0gICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gbWF4Rmlyc3RWaXNpYmxlKSB7Ci0JbHBobC0+Rmlyc3RWaXNpYmxlID0gbWF4Rmlyc3RWaXNpYmxlOwotICAgICAgfQotICAgICAgcmV0dXJuIDE7CisgICAgcHJpbnRmKCAiTGlzdGJveDpcbiIgKTsKKyAgICBwcmludGYoICJod25kPSUwNHggZGVzY3I9JTA4eCBoZWFwPSUwOHggaXRlbXM9JWQgdG9wPSVkXG4iLAorICAgICAgICAgICAgd25kLT5od25kU2VsZiwgKFVJTlQzMilkZXNjciwgZGVzY3ItPmhlYXAsIGRlc2NyLT5uYl9pdGVtcywKKyAgICAgICAgICAgIGRlc2NyLT50b3BfaXRlbSApOworICAgIGZvciAoaSA9IDAsIGl0ZW0gPSBkZXNjci0+aXRlbXM7IGkgPCBkZXNjci0+bmJfaXRlbXM7IGkrKywgaXRlbSsrKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCAiJTRkOiAlLTQwcyAlZCAlMDhseCAlM2RcbiIsCisgICAgICAgICAgICAgICAgaSwgaXRlbS0+c3RyLCBpdGVtLT5zZWxlY3RlZCwgaXRlbS0+ZGF0YSwgaXRlbS0+aGVpZ2h0ICk7CiAgICAgfQotICB9IAotICByZXR1cm4gMDsKIH0KIAogCi1MUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfR2V0Q3VycmVudFBhZ2VTaXplCisgKgorICogUmV0dXJuIHRoZSBjdXJyZW50IHBhZ2Ugc2l6ZQorICovCitzdGF0aWMgSU5UMzIgTElTVEJPWF9HZXRDdXJyZW50UGFnZVNpemUoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IgKQogewotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgVUlOVCAgICAgICAgIENvdW50ID0gMDsKLQotICBpZiAodUluZGV4ID49IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBOVUxMOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICB3aGlsZSAoQ291bnQrKyA8IHVJbmRleCkgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgcmV0dXJuIGxwbHM7CisgICAgSU5UMzIgaSwgaGVpZ2h0OworICAgIGlmICghKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkpIHJldHVybiBkZXNjci0+cGFnZV9zaXplOworICAgIGZvciAoaSA9IGRlc2NyLT50b3BfaXRlbSwgaGVpZ2h0ID0gMDsgaSA8IGRlc2NyLT5uYl9pdGVtczsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChoZWlnaHQgKz0gZGVzY3ItPml0ZW1zW2ldLmhlaWdodCkgPiBkZXNjci0+aGVpZ2h0KSBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gZGVzY3ItPnRvcF9pdGVtKSByZXR1cm4gMTsKKyAgICBlbHNlIHJldHVybiBpIC0gZGVzY3ItPnRvcF9pdGVtOwogfQogCiAKLXZvaWQgTGlzdEJveERyYXdJdGVtKEhXTkQgaHduZCwgTFBIRUFETElTVCBscGhsLCBIREMxNiBoZGMsIExQTElTVFNUUlVDVCBscGxzLCAKLSAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqcmVjdCwgV09SRCBpdGVtQWN0aW9uLCBXT1JEIGl0ZW1TdGF0ZSkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfR2V0TWF4VG9wSW5kZXgKKyAqCisgKiBSZXR1cm4gdGhlIG1heGltdW0gcG9zc2libGUgaW5kZXggZm9yIHRoZSB0b3Agb2YgdGhlIGxpc3Rib3guCisgKi8KK3N0YXRpYyBJTlQzMiBMSVNUQk9YX0dldE1heFRvcEluZGV4KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyICkKIHsKLSAgICBpZiAobHBobC0+T3duZXJEcmF3bikKKyAgICBJTlQzMiBtYXgsIHBhZ2U7CisKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQorICAgIHsKKyAgICAgICAgcGFnZSA9IGRlc2NyLT5oZWlnaHQ7CisgICAgICAgIGZvciAobWF4ID0gZGVzY3ItPm5iX2l0ZW1zIC0gMTsgbWF4ID49IDA7IG1heC0tKQorICAgICAgICAgICAgaWYgKChwYWdlIC09IGRlc2NyLT5pdGVtc1ttYXhdLmhlaWdodCkgPCAwKSBicmVhazsKKyAgICAgICAgaWYgKG1heCA8IGRlc2NyLT5uYl9pdGVtcyAtIDEpIG1heCsrOworICAgIH0KKyAgICBlbHNlIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgeworICAgICAgICBpZiAoKHBhZ2UgPSBkZXNjci0+d2lkdGggLyBkZXNjci0+Y29sdW1uX3dpZHRoKSA8IDEpIHBhZ2UgPSAxOworICAgICAgICBtYXggPSAoZGVzY3ItPm5iX2l0ZW1zICsgZGVzY3ItPnBhZ2Vfc2l6ZSAtIDEpIC8gZGVzY3ItPnBhZ2Vfc2l6ZTsKKyAgICAgICAgbWF4ID0gKG1heCAtIHBhZ2UpICogZGVzY3ItPnBhZ2Vfc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbWF4ID0gZGVzY3ItPm5iX2l0ZW1zIC0gZGVzY3ItPnBhZ2Vfc2l6ZTsKKyAgICB9CisgICAgaWYgKG1heCA8IDApIG1heCA9IDA7CisgICAgcmV0dXJuIG1heDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbAorICoKKyAqIFVwZGF0ZSB0aGUgc2Nyb2xsYmFycy4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUgY29udGVudAorICogb2YgdGhlIGxpc3Rib3ggY2hhbmdlcy4KKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9VcGRhdGVTY3JvbGwoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IgKQoreworICAgIFNDUk9MTElORk8gaW5mbzsKKworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9SRURSQVcpIHJldHVybjsKKyAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKKworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgeworICAgICAgICBpbmZvLm5NaW4gID0gMDsKKyAgICAgICAgaW5mby5uTWF4ICA9IChkZXNjci0+bmJfaXRlbXMgLSAxKSAvIGRlc2NyLT5wYWdlX3NpemU7CisgICAgICAgIGluZm8ublBvcyAgPSBkZXNjci0+dG9wX2l0ZW0gLyBkZXNjci0+cGFnZV9zaXplOworICAgICAgICBpbmZvLm5QYWdlID0gZGVzY3ItPndpZHRoIC8gZGVzY3ItPmNvbHVtbl93aWR0aDsKKyAgICAgICAgaWYgKGluZm8ublBhZ2UgPCAxKSBpbmZvLm5QYWdlID0gMTsKKyAgICAgICAgaW5mby5mTWFzayA9IFNJRl9SQU5HRSB8IFNJRl9QT1MgfCBTSUZfUEFHRTsKKyAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19ESVNBQkxFTk9TQ1JPTEwpCisgICAgICAgICAgICBpbmZvLmZNYXNrIHw9IFNJRl9ESVNBQkxFTk9TQ1JPTEw7CisgICAgICAgIFNldFNjcm9sbEluZm8zMiggd25kLT5od25kU2VsZiwgU0JfSE9SWiwgJmluZm8sIFRSVUUgKTsKKyAgICAgICAgaW5mby5uTWF4ID0gMDsKKyAgICAgICAgaW5mby5mTWFzayA9IFNJRl9SQU5HRTsKKyAgICAgICAgU2V0U2Nyb2xsSW5mbzMyKCB3bmQtPmh3bmRTZWxmLCBTQl9WRVJULCAmaW5mbywgVFJVRSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmZvLm5NaW4gID0gMDsKKyAgICAgICAgaW5mby5uTWF4ICA9IGRlc2NyLT5uYl9pdGVtcyAtIDE7CisgICAgICAgIGluZm8ublBvcyAgPSBkZXNjci0+dG9wX2l0ZW07CisgICAgICAgIGluZm8ublBhZ2UgPSBMSVNUQk9YX0dldEN1cnJlbnRQYWdlU2l6ZSggd25kLCBkZXNjciApOworICAgICAgICBpbmZvLmZNYXNrID0gU0lGX1JBTkdFIHwgU0lGX1BPUyB8IFNJRl9QQUdFOworICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX0RJU0FCTEVOT1NDUk9MTCkKKyAgICAgICAgICAgIGluZm8uZk1hc2sgfD0gU0lGX0RJU0FCTEVOT1NDUk9MTDsKKyAgICAgICAgU2V0U2Nyb2xsSW5mbzMyKCB3bmQtPmh3bmRTZWxmLCBTQl9WRVJULCAmaW5mbywgVFJVRSApOworCisgICAgICAgIGlmIChkZXNjci0+aG9yel9leHRlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZm8ubk1pbiAgPSAwOworICAgICAgICAgICAgaW5mby5uTWF4ICA9IGRlc2NyLT5ob3J6X2V4dGVudCAtIDE7CisgICAgICAgICAgICBpbmZvLm5Qb3MgID0gZGVzY3ItPmhvcnpfcG9zOworICAgICAgICAgICAgaW5mby5uUGFnZSA9IGRlc2NyLT53aWR0aDsKKyAgICAgICAgICAgIGluZm8uZk1hc2sgPSBTSUZfUkFOR0UgfCBTSUZfUE9TIHwgU0lGX1BBR0U7CisgICAgICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX0RJU0FCTEVOT1NDUk9MTCkKKyAgICAgICAgICAgICAgICBpbmZvLmZNYXNrIHw9IFNJRl9ESVNBQkxFTk9TQ1JPTEw7CisgICAgICAgICAgICBTZXRTY3JvbGxJbmZvMzIoIHduZC0+aHduZFNlbGYsIFNCX0hPUlosICZpbmZvLCBUUlVFICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtCisgKgorICogU2V0IHRoZSB0b3AgaXRlbSBvZiB0aGUgbGlzdGJveCwgc2Nyb2xsaW5nIHVwIG9yIGRvd24gaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX1NldFRvcEl0ZW0oIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgc2Nyb2xsICkKK3sKKyAgICBJTlQzMiBtYXggPSBMSVNUQk9YX0dldE1heFRvcEluZGV4KCB3bmQsIGRlc2NyICk7CisgICAgaWYgKGluZGV4ID4gbWF4KSBpbmRleCA9IG1heDsKKyAgICBpZiAoaW5kZXggPCAwKSBpbmRleCA9IDA7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSUNPTFVNTikgaW5kZXggLT0gaW5kZXggJSBkZXNjci0+cGFnZV9zaXplOworICAgIGlmIChkZXNjci0+dG9wX2l0ZW0gPT0gaW5kZXgpIHJldHVybiBMQl9PS0FZOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgeworICAgICAgICBJTlQzMiBkaWZmID0gKGRlc2NyLT50b3BfaXRlbSAtIGluZGV4KSAvIGRlc2NyLT5wYWdlX3NpemUgKiBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgICAgICBpZiAoc2Nyb2xsICYmIChhYnMoZGlmZikgPCBkZXNjci0+d2lkdGgpKQorICAgICAgICAgICAgU2Nyb2xsV2luZG93MzIoIHduZC0+aHduZFNlbGYsIGRpZmYsIDAsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Nyb2xsID0gRkFMU0U7CisgICAgfQorICAgIGVsc2UgaWYgKHNjcm9sbCkKKyAgICB7CisgICAgICAgIElOVDMyIGRpZmY7CisgICAgICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIElOVDMyIGk7CisgICAgICAgICAgICBkaWZmID0gMDsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IGRlc2NyLT50b3BfaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbmRleCAtIDE7IGkgPj0gZGVzY3ItPnRvcF9pdGVtOyBpLS0pCisgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gZGVzY3ItPml0ZW1zW2ldLmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBpbmRleDsgaSA8IGRlc2NyLT50b3BfaXRlbTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkaWZmICs9IGRlc2NyLT5pdGVtc1tpXS5oZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGRpZmYgPSAoZGVzY3ItPnRvcF9pdGVtIC0gaW5kZXgpICogZGVzY3ItPml0ZW1faGVpZ2h0OworCisgICAgICAgIGlmIChhYnMoZGlmZikgPCBkZXNjci0+aGVpZ2h0KQorICAgICAgICAgICAgU2Nyb2xsV2luZG93MzIoIHduZC0+aHduZFNlbGYsIDAsIGRpZmYsIE5VTEwsIE5VTEwgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Nyb2xsID0gRkFMU0U7CisgICAgfQorICAgIGlmICghc2Nyb2xsKSBJbnZhbGlkYXRlUmVjdDMyKCB3bmQtPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7CisgICAgZGVzY3ItPnRvcF9pdGVtID0gaW5kZXg7CisgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKKyAgICByZXR1cm4gTEJfT0tBWTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1VwZGF0ZVBhZ2UKKyAqCisgKiBVcGRhdGUgdGhlIHBhZ2Ugc2l6ZS4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBzaXplIG9mCisgKiB0aGUgY2xpZW50IGFyZWEgb3IgdGhlIGl0ZW0gaGVpZ2h0IGNoYW5nZXMuCisgKi8KK3N0YXRpYyB2b2lkIExJU1RCT1hfVXBkYXRlUGFnZSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciApCit7CisgICAgSU5UMzIgcGFnZV9zaXplOworCisgICAgaWYgKChwYWdlX3NpemUgPSBkZXNjci0+aGVpZ2h0IC8gZGVzY3ItPml0ZW1faGVpZ2h0KSA8IDEpIHBhZ2Vfc2l6ZSA9IDE7CisgICAgaWYgKHBhZ2Vfc2l6ZSA9PSBkZXNjci0+cGFnZV9zaXplKSByZXR1cm47CisgICAgZGVzY3ItPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCB3bmQtPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7CisgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+dG9wX2l0ZW0sIEZBTFNFICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9VcGRhdGVTaXplCisgKgorICogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBsaXN0Ym94LiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHNpemUgb2YKKyAqIHRoZSBjbGllbnQgYXJlYSBjaGFuZ2VzLgorICovCitzdGF0aWMgdm9pZCBMSVNUQk9YX1VwZGF0ZVNpemUoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IgKQoreworICAgIFJFQ1QzMiByZWN0OworCisgICAgR2V0Q2xpZW50UmVjdDMyKCB3bmQtPmh3bmRTZWxmLCAmcmVjdCApOworICAgIGRlc2NyLT53aWR0aCAgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICAgIGRlc2NyLT5oZWlnaHQgPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworICAgIGlmICghKGRlc2NyLT5zdHlsZSAmIExCU19OT0lOVEVHUkFMSEVJR0hUKSkKKyAgICB7CisgICAgICAgIGlmICgoZGVzY3ItPmhlaWdodCA+IGRlc2NyLT5pdGVtX2hlaWdodCkgJiYKKyAgICAgICAgICAgIChkZXNjci0+aGVpZ2h0ICUgZGVzY3ItPml0ZW1faGVpZ2h0KSkKKyAgICAgICAgeworICAgICAgICAgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogY2hhbmdpbmcgaGVpZ2h0ICVkIC0+ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGRlc2NyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmhlaWdodCAtIGRlc2NyLT5oZWlnaHQlZGVzY3ItPml0ZW1faGVpZ2h0ICk7CisgICAgICAgICAgICBTZXRXaW5kb3dQb3MoIHduZC0+aHduZFNlbGYsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+cmVjdFdpbmRvdy5yaWdodCAtIHduZC0+cmVjdFdpbmRvdy5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPnJlY3RXaW5kb3cuYm90dG9tIC0gd25kLT5yZWN0V2luZG93LnRvcCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3ItPmhlaWdodCAlIGRlc2NyLT5pdGVtX2hlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT1pPUkRFUiB8IFNXUF9OT0FDVElWQVRFIHwgU1dQX05PTU9WRSApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBuZXcgc2l6ZSA9ICVkLCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgZGVzY3ItPndpZHRoLCBkZXNjci0+aGVpZ2h0ICk7CisgICAgTElTVEJPWF9VcGRhdGVQYWdlKCB3bmQsIGRlc2NyICk7CisgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0dldEl0ZW1SZWN0CisgKgorICogR2V0IHRoZSByZWN0YW5nbGUgZW5jbG9zaW5nIGFuIGl0ZW0sIGluIGxpc3Rib3ggY2xpZW50IGNvb3JkaW5hdGVzLgorICogUmV0dXJuIDEgaWYgdGhlIHJlY3RhbmdsZSBpcyAocGFydGlhbGx5KSB2aXNpYmxlLCAwIGlmIGhpZGRlbiwgLTEgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfR2V0SXRlbVJlY3QoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDVDMyICpyZWN0ICkKK3sKKyAgICAvKiBJbmRleCA8PSAwIGlzIGxlZ2FsIGV2ZW4gb24gZW1wdHkgbGlzdGJveGVzICovCisgICAgaWYgKGluZGV4ICYmIChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gLTE7CisgICAgU2V0UmVjdDMyKCByZWN0LCAwLCAwLCBkZXNjci0+d2lkdGgsIGRlc2NyLT5oZWlnaHQgKTsKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgIHsKKyAgICAgICAgSU5UMzIgY29sID0gKGluZGV4IC8gZGVzY3ItPnBhZ2Vfc2l6ZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyLT50b3BfaXRlbSAvIGRlc2NyLT5wYWdlX3NpemUpOworICAgICAgICByZWN0LT5sZWZ0ICs9IGNvbCAqIGRlc2NyLT5jb2x1bW5fd2lkdGg7CisgICAgICAgIHJlY3QtPnJpZ2h0ID0gcmVjdC0+bGVmdCArIGRlc2NyLT5jb2x1bW5fd2lkdGg7CisgICAgICAgIHJlY3QtPnRvcCArPSAoaW5kZXggJSBkZXNjci0+cGFnZV9zaXplKSAqIGRlc2NyLT5pdGVtX2hlaWdodDsKKyAgICAgICAgcmVjdC0+Ym90dG9tID0gcmVjdC0+dG9wICsgZGVzY3ItPml0ZW1faGVpZ2h0OworICAgIH0KKyAgICBlbHNlIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpCisgICAgeworICAgICAgICBJTlQzMiBpOworICAgICAgICBpZiAoaW5kZXggPCBkZXNjci0+dG9wX2l0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGRlc2NyLT50b3BfaXRlbS0xOyBpID49IGluZGV4OyBpLS0pCisgICAgICAgICAgICAgICAgcmVjdC0+dG9wIC09IGRlc2NyLT5pdGVtc1tpXS5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBkZXNjci0+dG9wX2l0ZW07IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAgICAgICAgIHJlY3QtPnRvcCArPSBkZXNjci0+aXRlbXNbaV0uaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJlY3QtPmJvdHRvbSA9IHJlY3QtPnRvcCArIGRlc2NyLT5pdGVtc1tpbmRleF0uaGVpZ2h0OworICAgICAgICByZWN0LT5yaWdodCArPSBkZXNjci0+aG9yel9wb3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlY3QtPnRvcCArPSAoaW5kZXggLSBkZXNjci0+dG9wX2l0ZW0pICogZGVzY3ItPml0ZW1faGVpZ2h0OworICAgICAgICByZWN0LT5ib3R0b20gPSByZWN0LT50b3AgKyBkZXNjci0+aXRlbV9oZWlnaHQ7CisgICAgICAgIHJlY3QtPnJpZ2h0ICs9IGRlc2NyLT5ob3J6X3BvczsKKyAgICB9CisKKyAgICByZXR1cm4gKChyZWN0LT5sZWZ0IDwgZGVzY3ItPndpZHRoKSAmJiAocmVjdC0+cmlnaHQgPiAwKSAmJgorICAgICAgICAgICAgKHJlY3QtPnRvcCA8IGRlc2NyLT5oZWlnaHQpICYmIChyZWN0LT5ib3R0b20gPiAwKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9HZXRJdGVtRnJvbVBvaW50CisgKgorICogUmV0dXJuIHRoZSBpdGVtIG5lYXJlc3QgZnJvbSBwb2ludCAoeCx5KSAoaW4gY2xpZW50IGNvb3JkaW5hdGVzKS4KKyAqLworc3RhdGljIElOVDMyIExJU1RCT1hfR2V0SXRlbUZyb21Qb2ludCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHkgKQoreworICAgIElOVDMyIGluZGV4ID0gZGVzY3ItPnRvcF9pdGVtOworCisgICAgaWYgKCFkZXNjci0+bmJfaXRlbXMpIHJldHVybiAtMTsgIC8qIE5vIGl0ZW1zICovCisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkKKyAgICB7CisgICAgICAgIElOVDMyIHBvcyA9IDA7CisgICAgICAgIGlmICh5ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGRlc2NyLT5uYl9pdGVtcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBvcyArPSBkZXNjci0+aXRlbXNbaW5kZXhdLmhlaWdodCkgPiB5KSBicmVhazsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleC0tOworICAgICAgICAgICAgICAgIGlmICgocG9zIC09IGRlc2NyLT5pdGVtc1tpbmRleF0uaGVpZ2h0KSA8PSB5KSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgeworICAgICAgICBpZiAoeSA+PSBkZXNjci0+aXRlbV9oZWlnaHQgKiBkZXNjci0+cGFnZV9zaXplKSByZXR1cm4gLTE7CisgICAgICAgIGlmICh5ID49IDApIGluZGV4ICs9IHkgLyBkZXNjci0+aXRlbV9oZWlnaHQ7CisgICAgICAgIGlmICh4ID49IDApIGluZGV4ICs9ICh4IC8gZGVzY3ItPmNvbHVtbl93aWR0aCkgKiBkZXNjci0+cGFnZV9zaXplOworICAgICAgICBlbHNlIGluZGV4IC09ICgoKHggKyAxKSAvIGRlc2NyLT5jb2x1bW5fd2lkdGgpIC0gMSkgKiBkZXNjci0+cGFnZV9zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmRleCArPSAoeSAvIGRlc2NyLT5pdGVtX2hlaWdodCk7CisgICAgfQorICAgIGlmIChpbmRleCA8IDApIHJldHVybiAwOworICAgIGlmIChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpIHJldHVybiAtMTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9QYWludEl0ZW0KKyAqCisgKiBQYWludCBhbiBpdGVtLgorICovCitzdGF0aWMgdm9pZCBMSVNUQk9YX1BhaW50SXRlbSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSERDMzIgaGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QzMiAqcmVjdCwgSU5UMzIgaW5kZXgsIFVJTlQzMiBhY3Rpb24gKQoreworICAgIExCX0lURU1EQVRBICppdGVtID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCBkZXNjci0+bmJfaXRlbXMpIGl0ZW0gPSAmZGVzY3ItPml0ZW1zW2luZGV4XTsKKworICAgIGlmIChJU19PV05FUkRSQVcoZGVzY3IpKQogICAgIHsKICAgICAgICAgRFJBV0lURU1TVFJVQ1QzMiBkaXM7Ci0KLSAgICAgICAgZGlzLkN0bElEICAgICAgPSBscGxzLT5taXMuQ3RsSUQ7Ci0gICAgICAgIGRpcy5DdGxUeXBlICAgID0gbHBscy0+bWlzLkN0bFR5cGU7Ci0gICAgICAgIGRpcy5pdGVtSUQgICAgID0gbHBscy0+bWlzLml0ZW1JRDsKLSAgICAgICAgZGlzLmhEQyAgICAgICAgPSBoZGM7Ci0gICAgICAgIGRpcy5od25kSXRlbSAgID0gaHduZDsKLSAgICAgICAgZGlzLml0ZW1EYXRhICAgPSBscGxzLT5taXMuaXRlbURhdGE7Ci0gICAgICAgIGRpcy5pdGVtQWN0aW9uID0gaXRlbUFjdGlvbjsKLSAgICAgICAgZGlzLml0ZW1TdGF0ZSAgPSBpdGVtU3RhdGU7Ci0gICAgICAgIENPTlZfUkVDVDE2VE8zMiggcmVjdCwgJmRpcy5yY0l0ZW0gKTsKLSAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGwtPmhQYXJlbnQsIFdNX0RSQVdJVEVNLCBkaXMuQ3RsSUQsIChMUEFSQU0pJmRpcyApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpdGVtQWN0aW9uID09IE9EQV9EUkFXRU5USVJFIHx8IGl0ZW1BY3Rpb24gPT0gT0RBX1NFTEVDVCkgewotICAgICAgaW50IAlPbGRCa01vZGU7Ci0gICAgICBEV09SRCAJZHdPbGRUZXh0Q29sb3IgPSAwOwotCi0gICAgICBPbGRCa01vZGUgPSBTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0KLSAgICAgIGlmIChpdGVtU3RhdGUgIT0gMCkgewotCWR3T2xkVGV4dENvbG9yID0gU2V0VGV4dENvbG9yKGhkYywgMHgwMEZGRkZGRkwpOwotCUZpbGxSZWN0MTYoaGRjLCByZWN0LCBHZXRTdG9ja09iamVjdDMyKEJMQUNLX0JSVVNIKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX1VTRVRBQlNUT1BTKSB7Ci0JVGFiYmVkVGV4dE91dChoZGMsIHJlY3QtPmxlZnQgKyA1LCByZWN0LT50b3AgKyAyLCAKLQkJICAgICAgKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpLCAKLQkJICAgICAgbHBobC0+aU51bVN0b3BzLCBscGhsLT5UYWJTdG9wcywgMCk7Ci0gICAgICB9IGVsc2UgewotCVRleHRPdXQxNihoZGMsIHJlY3QtPmxlZnQgKyA1LCByZWN0LT50b3AgKyAyLAotICAgICAgICAgICAgICAgICAgKGNoYXIgKilscGxzLT5pdGVtVGV4dCwgc3RybGVuKChjaGFyICopbHBscy0+aXRlbVRleHQpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGl0ZW1TdGF0ZSAhPSAwKSB7Ci0JU2V0VGV4dENvbG9yKGhkYywgZHdPbGRUZXh0Q29sb3IpOwotICAgICAgfQotICAgICAgCi0gICAgICBTZXRCa01vZGUoaGRjLCBPbGRCa01vZGUpOwotICAgIH0KLSAgICBlbHNlIERyYXdGb2N1c1JlY3QxNihoZGMsIHJlY3QpOwotfQotCi0KLWludCBMaXN0Qm94RmluZE1vdXNlKExQSEVBRExJU1QgbHBobCwgaW50IFgsIGludCBZKQotewotICBMUExJU1RTVFJVQ1QgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0gIGludCAgICAgICAgICBpLCBqOwotICBQT0lOVDE2ICAgICAgcG9pbnQ7Ci0gIAotICBwb2ludC54ID0gWDsgcG9pbnQueSA9IFk7Ci0gIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiBMQl9FUlI7Ci0KLSAgZm9yKGkgPSAwOyBpIDwgbHBobC0+Rmlyc3RWaXNpYmxlOyBpKyspIHsKLSAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLSAgZm9yKGogPSAwOyBqIDwgbHBobC0+SXRlbXNWaXNpYmxlOyBpKyssIGorKykgewotICAgIGlmIChscGxzID09IE5VTEwpIHJldHVybiBMQl9FUlI7Ci0gICAgaWYgKFB0SW5SZWN0MTYoJmxwbHMtPml0ZW1SZWN0LHBvaW50KSkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveEZpbmRNb3VzZTogbm90IGZvdW5kXG4iKTsKLSAgcmV0dXJuIExCX0VSUjsKLX0KLQotQk9PTDMyIGxiRGVsZXRlSXRlbU5vdGlmeShMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKQotewotICAgIC8qIGNhbGxlZCBvbmx5IGZvciBvd25lciBkcmF3biBsaXN0Ym94ZXMgKi8KLSAgICBCT09MMzIgcmV0OwotICAgIERFTEVURUlURU1TVFJVQ1QxNiAqZGVsSXRlbSA9IFNFR1BUUl9ORVcoREVMRVRFSVRFTVNUUlVDVDE2KTsKLSAgICBpZiAoIWRlbEl0ZW0pIHJldHVybiBGQUxTRTsKLQotICAgIGRlbEl0ZW0tPkN0bFR5cGUgID0gbHBobC0+RHJhd0N0bFR5cGU7Ci0gICAgZGVsSXRlbS0+Q3RsSUQgICAgPSBscGhsLT5DdGxJRDsKLSAgICBkZWxJdGVtLT5pdGVtSUQgICA9IGxwbHMtPm1pcy5pdGVtSUQ7Ci0gICAgZGVsSXRlbS0+aHduZEl0ZW0gPSBscGhsLT5oU2VsZjsKLSAgICBkZWxJdGVtLT5pdGVtRGF0YSA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKLQotICAgIHJldCA9IFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX0RFTEVURUlURU0sIChXUEFSQU0xNilscGhsLT5DdGxJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQoZGVsSXRlbSkgKTsKLSAgICBTRUdQVFJfRlJFRShkZWxJdGVtKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIExpc3RCb3hBc2tNZWFzdXJlKExQSEVBRExJU1QgbHBobCwgTFBMSVNUU1RSVUNUIGxwbHMpICAKLXsKLSAgICBNRUFTVVJFSVRFTVNUUlVDVDE2ICpscG1lYXN1cmUgPSBTRUdQVFJfTkVXKE1FQVNVUkVJVEVNU1RSVUNUMTYpOwotICAgIGlmICghbHBtZWFzdXJlKSByZXR1cm47Ci0gICAgKmxwbWVhc3VyZSA9IGxwbHMtPm1pczsKLSAgICBscG1lYXN1cmUtPml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICAgIFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX01FQVNVUkVJVEVNLCBscGhsLT5DdGxJRCwKLSAgICAgICAgICAgICAgICAgICAoTFBBUkFNKVNFR1BUUl9HRVQobHBtZWFzdXJlKSApOwotCi0gICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXRklYRUQpCi0gICAgewotICAgICAgICBpZiAobHBtZWFzdXJlLT5pdGVtSGVpZ2h0ID4gbHBobC0+U3RkSXRlbUhlaWdodCkKLSAgICAgICAgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSBscG1lYXN1cmUtPml0ZW1IZWlnaHQ7Ci0gICAgICAgIGxwbHMtPm1pcy5pdGVtSGVpZ2h0ID0gbHBtZWFzdXJlLT5pdGVtSGVpZ2h0OwotICAgIH0KLSAgICBTRUdQVFJfRlJFRShscG1lYXN1cmUpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBzdHJpbmdzIGFuZCBpdGVtIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1MUExJU1RTVFJVQ1QgTGlzdEJveENyZWF0ZUl0ZW0oTFBIRUFETElTVCBscGhsLCBpbnQgaWQpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzbmV3ID0gKExQTElTVFNUUlVDVCltYWxsb2Moc2l6ZW9mKExJU1RTVFJVQ1QpKTsKLQotICBpZiAobHBsc25ldyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgCi0gIGxwbHNuZXctPml0ZW1TdGF0ZSAgICAgID0gMDsKLSAgbHBsc25ldy0+bWlzLkN0bFR5cGUgICAgPSBscGhsLT5EcmF3Q3RsVHlwZTsKLSAgbHBsc25ldy0+bWlzLkN0bElEICAgICAgPSBscGhsLT5DdGxJRDsKLSAgbHBsc25ldy0+bWlzLml0ZW1JRCAgICAgPSBpZDsKLSAgbHBsc25ldy0+bWlzLml0ZW1IZWlnaHQgPSBscGhsLT5TdGRJdGVtSGVpZ2h0OwotICBscGxzbmV3LT5taXMuaXRlbVdpZHRoICA9IDA7IC8qIGlnbm9yZWQgKi8KLSAgbHBsc25ldy0+bWlzLml0ZW1EYXRhICAgPSAwOwotICBTZXRSZWN0RW1wdHkxNiggJmxwbHNuZXctPml0ZW1SZWN0ICk7Ci0KLSAgcmV0dXJuIGxwbHNuZXc7Ci19Ci0KLWludCBMaXN0Qm94QXNrQ29tcGFyZShMUEhFQURMSVNUIGxwaGwsIGludCBzdGFydEl0ZW0sIFNFR1BUUiBtYXRjaERhdGEsIEJPT0wgZXhhY3RNYXRjaCApCi17Ci0gLyogIERvIGJpbmFyeSBzZWFyY2ggZm9yIHNvcnRlZCBsaXN0Ym94ZXMuIExpbmtlZCBsaXN0IGl0ZW0gc3RvcmFnZSBzb3J0IG9mIAotICAqICBkZWZlYXRzIHRoZSBwdXJwb3NlICggZm9yY2VzIHRvIHRyYXZlcnNlIGl0ZW0gbGlzdCBhbGwgdGhlIHRpbWUgKSBidXQgTSQgZG9lcyBpdCB0aGlzIHdheS4uLgotICAqCi0gICogIE1BVENIX05FQVJFU1QgKDApIC0gcmV0dXJuIHBvc2l0aW9uIGZvciBpbnNlcnRpb24gLSBmb3IgYWxsIHN0eWxlcwotICAqICBNQVRDSF9FWEFDVCAgICgxKSAtIHNlYXJjaCBmb3IgYW4gaXRlbSwgcmV0dXJuIGluZGV4IG9yIExCX0VSUiAKLSAgKiAgTUFUQ0hfU1VCU1RSICAoMikgLSBzYW1lIGFzIGV4YWN0IG1hdGNoIGJ1dCB3aXRoIHN0cm5jbXAgZm9yIHN0cmluZyBjb21wYXJpc2lvbgotICAqLwotCi0gQ09NUEFSRUlURU1TVFJVQ1QxNiAgICppdGVtQ21wOwotIExQTElTVFNUUlVDVAkJY3VycmVudEl0ZW0gPSBOVUxMOwotIExQQ1NUUgkJCW1hdGNoU3RyID0gKGxwaGwtPkhhc1N0cmluZ3MpPyhMUENTVFIpUFRSX1NFR19UT19MSU4obWF0Y2hEYXRhKTpOVUxMOwotIGludCAgICAgICAgICAgICAgICAgICAgaGVhZCwgcG9zID0gLTEsIHRhaWwsIGxvb3AgPSAxOwotIHNob3J0ICAgICAgICAgICAgICAgICAgYiA9IDAsIHNfbGVuZ3RoID0gMDsKLQotIC8qIGNoZWNrIGlmIGVtcHR5ICovCi0KLSBpZiggIWxwaGwtPkl0ZW1zQ291bnQgKQotICAgIHJldHVybiAoZXhhY3RNYXRjaCk/IExCX0VSUjogMDsKLQotIC8qIHNldCB1cCB2YXJpYWJsZXMgKi8KLQotIGlmKCBleGFjdE1hdGNoID09IE1BVENIX05FQVJFU1QgKQotICAgICBzdGFydEl0ZW0gPSAwOwotIGVsc2UgaWYoICsrc3RhcnRJdGVtICkgCi0gICB7Ci0gICAgIGxvb3AgPSAyOwotICAgICBpZiggc3RhcnRJdGVtID49IGxwaGwtPkl0ZW1zQ291bnQgKSBzdGFydEl0ZW0gPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKLSAgIH0KLQotIGlmKCBleGFjdE1hdGNoID09IE1BVENIX1NVQlNUUiAmJiBscGhsLT5IYXNTdHJpbmdzICkKLSAgIHsKLSAgICAgc19sZW5ndGggPSBzdHJsZW4oIG1hdGNoU3RyICk7Ci0gICAgIGlmKCAhc19sZW5ndGggKSByZXR1cm4gMDsgCQkgICAgICAgIC8qIGhlYWQgb2YgdGhlIGxpc3QgLSBlbXB0eSBzdHJpbmcgKi8KLSAgIH0KLQotIGhlYWQgPSBzdGFydEl0ZW07IHRhaWwgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKLQotIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkFza0NvbXBhcmU6IGhlYWQgPSAlaSwgdGFpbCA9ICVpLCBkYXRhID0gJTA4eFxuIiwgaGVhZCwgdGFpbCwgKHVuc2lnbmVkKW1hdGNoRGF0YSApOwotCi0gaWYgKCEoaXRlbUNtcCA9IFNFR1BUUl9ORVcoQ09NUEFSRUlURU1TVFJVQ1QxNikpKSByZXR1cm4gMDsKLSBpdGVtQ21wLT5DdGxUeXBlICAgICAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOwotIGl0ZW1DbXAtPkN0bElEICAgICAgICAgID0gbHBobC0+Q3RsSUQ7Ci0gaXRlbUNtcC0+aHduZEl0ZW0gICAgICAgPSBscGhsLT5oU2VsZjsKLQotIC8qIHNlYXJjaCBmcm9tIHN0YXJ0SXRlbSAqLwotCi0gd2hpbGUgKCBsb29wLS0gKQotICB7Ci0gICAgd2hpbGUoIGhlYWQgPD0gdGFpbCApCi0gICAgIHsKLSAgICAgICBwb3MgPSAodGFpbCArIGhlYWQpLzI7Ci0gICAgICAgY3VycmVudEl0ZW0gPSBMaXN0Qm94R2V0SXRlbSggbHBobCwgcG9zICk7Ci0KLSAgICAgICBpZiggbHBobC0+SGFzU3RyaW5ncyApCi0JIHsKLSAgICAgICAgICAgYiA9ICggc19sZW5ndGggKT8gbHN0cm5jbXBpMzJBKCBjdXJyZW50SXRlbS0+aXRlbVRleHQsIG1hdGNoU3RyLCBzX2xlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbHN0cmNtcGkzMkEoIGN1cnJlbnRJdGVtLT5pdGVtVGV4dCwgbWF0Y2hTdHIpOwotCSB9Ci0gICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBpdGVtQ21wLT5pdGVtSUQxICAgICAgPSBwb3M7Ci0gICAgICAgICAgIGl0ZW1DbXAtPml0ZW1EYXRhMSAgICA9IGN1cnJlbnRJdGVtLT5taXMuaXRlbURhdGE7Ci0gICAgICAgICAgIGl0ZW1DbXAtPml0ZW1JRDIgICAgICA9IC0xOwotICAgICAgICAgICBpdGVtQ21wLT5pdGVtRGF0YTIgICAgPSBtYXRjaERhdGE7Ci0KLSAgICAgICAgICAgYiA9IFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX0NPTVBBUkVJVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KWxwaGwtPkN0bElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGl0ZW1DbXApICk7Ci0gICAgICAgICB9Ci0KLSAgICAgICBpZiggYiA9PSAwICkKLSAgICAgICB7Ci0gICAgICAgICAgIFNFR1BUUl9GUkVFKGl0ZW1DbXApOwotICAgICAgICAgICByZXR1cm4gcG9zOyAgLyogZm91bmQgZXhhY3QgbWF0Y2ggKi8KLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgICAgaWYoIGIgPCAwICkgaGVhZCA9ICsrcG9zOwotICAgICAgICAgZWxzZQotICAgICAgICAgICBpZiggYiA+IDAgKSB0YWlsID0gcG9zIC0gMTsKLSAgICAgfQotCi0gICAgLyogcmVzZXQgdG8gc2VhcmNoIGZyb20gdGhlIGZpcnN0IGl0ZW0gKi8KLSAgICBoZWFkID0gMDsgdGFpbCA9IHN0YXJ0SXRlbSAtIDE7Ci0gIH0KLQotIGRwcmludGZfbGlzdGJveChzdGRkZWIsIlx0LT4gcG9zID0gJWlcbiIsIHBvcyApOwotIFNFR1BUUl9GUkVFKGl0ZW1DbXApOwotCi0gLyogaWYgd2UgZ290IGhlcmUgbWF0Y2ggaXMgbm90IGV4YWN0ICovCi0KLSBpZiggcG9zIDwgMCApIHBvcyA9IDA7Ci0gZWxzZSBpZiggcG9zID4gbHBobC0+SXRlbXNDb3VudCApIHBvcyA9IGxwaGwtPkl0ZW1zQ291bnQ7Ci0KLSByZXR1cm4gKGV4YWN0TWF0Y2gpPyBMQl9FUlI6IHBvczsKLX0KLQotaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBDU1RSIG5ld3N0cikKLXsKLSAgTFBMSVNUU1RSVUNUICpscHBscywgbHBsc25ldywgbHBsczsKLSAgSEFORExFMTYgaFN0cjsKLSAgTFBTVFIJc3RyOwotICBVSU5UCUNvdW50OwotICAgIAotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94SW5zZXJ0U3RyaW5nKCVkLCAlcCk7XG4iLCB1SW5kZXgsIG5ld3N0cik7Ci0gICAgCi0gIGlmICghbmV3c3RyKSByZXR1cm4gLTE7Ci0KLSAgaWYgKHVJbmRleCA9PSAoVUlOVCktMSkKLSAgICB1SW5kZXggPSBscGhsLT5JdGVtc0NvdW50OwotCi0gIGxwcGxzID0gJmxwaGwtPmxwRmlyc3Q7Ci0gIGZvcihDb3VudCA9IDA7IENvdW50IDwgdUluZGV4OyBDb3VudCsrKSB7Ci0gICAgaWYgKCpscHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGxwcGxzID0gKExQTElTVFNUUlVDVCAqKSAmKCpscHBscyktPmxwTmV4dDsKLSAgfQotICAgIAotICBscGxzbmV3ID0gTGlzdEJveENyZWF0ZUl0ZW0obHBobCwgQ291bnQpOwotICAKLSAgaWYgKGxwbHNuZXcgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkbmltcCwiTGlzdEJveEluc2VydFN0cmluZygpIG91dCBvZiBtZW1vcnkgIVxuIik7Ci0gICAgcmV0dXJuIExCX0VSUlNQQUNFOwotICB9Ci0KLSAgbHBsc25ldy0+bHBOZXh0ID0gKmxwcGxzOwotICAqbHBwbHMgPSBscGxzbmV3OwotICBscGhsLT5JdGVtc0NvdW50Kys7Ci0gIAotICBoU3RyID0gMDsKLSAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpIHsKLSAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCIgIHN0cmluZzogJXNcbiIsIG5ld3N0cik7Ci0gICAgaFN0ciA9IExJU1RfSEVBUF9BTExPQyhscGhsLCBMTUVNX01PVkVBQkxFLCBzdHJsZW4obmV3c3RyKSArIDEpOwotICAgIHN0ciA9IChMUFNUUilMSVNUX0hFQVBfQUREUihscGhsLCBoU3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwpIHJldHVybiBMQl9FUlJTUEFDRTsKLSAgICBzdHJjcHkoc3RyLCBuZXdzdHIpOyAKLSAgICBscGxzbmV3LT5pdGVtVGV4dCA9IHN0cjsKLSAgICAvKiBJJ20gbm90IHNvIHN1cmUgYWJvdXQgdGhlIG5leHQgb25lICovCi0gICAgbHBsc25ldy0+bWlzLml0ZW1EYXRhID0gMDsKLSAgfSBlbHNlIHsKLSAgICBscGxzbmV3LT5pdGVtVGV4dCA9IE5VTEw7Ci0gICAgbHBsc25ldy0+bWlzLml0ZW1EYXRhID0gKERXT1JEKW5ld3N0cjsKLSAgfQotCi0gIGxwbHNuZXctPm1pcy5pdGVtSUQgPSB1SW5kZXg7Ci0gIGxwbHNuZXctPmhEYXRhID0gaFN0cjsKLSAgCi0gIC8qIGFkanVzdCB0aGUgaXRlbUlEIGZpZWxkIG9mIHRoZSBmb2xsb3dpbmcgZW50cmllcyAqLwotICBmb3IobHBscyA9IGxwbHNuZXctPmxwTmV4dDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0KSB7Ci0gICAgICBscGxzLT5taXMuaXRlbUlEKys7Ci0gIH0KLSAKLSAgaWYgKGxwaGwtPm5lZWRNZWFzdXJlKSB7Ci0gICAgTGlzdEJveEFza01lYXN1cmUobHBobCwgbHBsc25ldyk7Ci0gIH0KLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94SW5zZXJ0U3RyaW5nIC8vIGNvdW50PSVkXG4iLCBscGhsLT5JdGVtc0NvdW50KTsKLSAgcmV0dXJuIHVJbmRleDsKLX0KLQotCi1pbnQgTGlzdEJveEFkZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFNFR1BUUiBpdGVtRGF0YSkKLXsKLSAgICBVSU5UIAlwb3MgPSAoVUlOVCkgLTE7Ci0gICAgTFBDU1RSCW5ld3N0ciA9IChscGhsLT5IYXNTdHJpbmdzKT8oTFBDU1RSKVBUUl9TRUdfVE9fTElOKGl0ZW1EYXRhKTooTFBDU1RSKWl0ZW1EYXRhOwotCi0gICAgaWYgKCBscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQgKSAKLQkgcG9zID0gTGlzdEJveEFza0NvbXBhcmUoIGxwaGwsIC0xLCBpdGVtRGF0YSwgTUFUQ0hfTkVBUkVTVCApOwotCi0gICAgcmV0dXJuIExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgcG9zLCBuZXdzdHIpOwotfQotCi0KLWludCBMaXN0Qm94R2V0VGV4dChMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBMUFNUUiBPdXRTdHIpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIGlmICghT3V0U3RyKSB7Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hHZXRUZXh0IC8vIE91dFN0cj09TlVMTFxuIik7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKk91dFN0ciA9ICdcMCc7Ci0gIGxwbHMgPSBMaXN0Qm94R2V0SXRlbSAobHBobCwgdUluZGV4KTsKLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHsKLSAgICAqKChsb25nICopT3V0U3RyKSA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKLSAgICByZXR1cm4gNDsKLSAgfQotCQotICBzdHJjcHkoT3V0U3RyLCBscGxzLT5pdGVtVGV4dCk7Ci0gIHJldHVybiBzdHJsZW4oT3V0U3RyKTsKLX0KLQotCi1EV09SRCBMaXN0Qm94R2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0KLSAgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB1SW5kZXgpOwotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICByZXR1cm4gbHBscy0+bWlzLml0ZW1EYXRhOwotfQotCi0KLWludCBMaXN0Qm94U2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgRFdPUkQgSXRlbURhdGEpCi17Ci0gIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgdUluZGV4KTsKLQotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICBscGxzLT5taXMuaXRlbURhdGEgPSBJdGVtRGF0YTsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotaW50IExpc3RCb3hEZWxldGVTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKLXsKLSAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOwotICBVSU5UCUNvdW50OwotCi0gIGlmICh1SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKLQotICBscGxzID0gbHBobC0+bHBGaXJzdDsKLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLQotICBpZiAodUluZGV4ID09IDApCi0gIHsKLSAgICBpZiggbHBobC0+T3duZXJEcmF3biApCi0gICAgICAgIGxiRGVsZXRlSXRlbU5vdGlmeSggbHBobCwgbHBscyk7Ci0gICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgTFBMSVNUU1RSVUNUIGxwbHMyID0gTlVMTDsKLSAgICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgewotICAgICAgaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gICAgICBscGxzMiA9IGxwbHM7Ci0gICAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7Ci0gICAgfQotICAgIGlmKCBscGhsLT5Pd25lckRyYXduICkKLQlsYkRlbGV0ZUl0ZW1Ob3RpZnkoIGxwaGwsIGxwbHMpOwotICAgIGxwbHMyLT5scE5leHQgPSBscGxzLT5scE5leHQ7Ci0gIH0KLQotICAvKiBhZGp1c3QgdGhlIGl0ZW1JRCBmaWVsZCBvZiB0aGUgZm9sbG93aW5nIGVudHJpZXMgKi8KLSAgZm9yKGxwbHMyID0gbHBscy0+bHBOZXh0OyBscGxzMiAhPSBOVUxMOyBscGxzMiA9IGxwbHMyLT5scE5leHQpIHsKLSAgICAgIGxwbHMyLT5taXMuaXRlbUlELS07Ci0gIH0KLSAKLSAgbHBobC0+SXRlbXNDb3VudC0tOwotCi0gIGlmIChscGxzLT5oRGF0YSAhPSAwKSBMSVNUX0hFQVBfRlJFRShscGhsLCBscGxzLT5oRGF0YSk7Ci0gIGZyZWUobHBscyk7Ci0gIAotICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKLX0KLQotaW50IGxiRmluZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFVJTlQgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIsIEJPT0wgbWF0Y2gpCi17Ci0gIC8qICBtYXRjaCBpcyBlaXRoZXIgTUFUQ0hfU1VCU1RSIG9yIE1BVENIX0VYQUNUICovCi0KLSAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0gIFVJTlQJICAgICAgIENvdW50OwotICBVSU5UICAgICAgICAgRmlyc3QgICAgICA9IG5GaXJzdCArIDE7Ci0gIGludAkgICAgICAgc19sZW5ndGggICA9IDA7Ci0gIExQU1RSICAgICAgICBscE1hdGNoU3RyID0gKExQU1RSKU1hdGNoU3RyOwotCi0gIGlmIChGaXJzdCA+IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfU09SVCApCi0gICAgICByZXR1cm4gTGlzdEJveEFza0NvbXBhcmUoIGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIG1hdGNoICk7Ci0KLSAgaWYgKGxwaGwtPkhhc1N0cmluZ3MgKSAKLSAgewotICAgIGxwTWF0Y2hTdHIgPSBQVFJfU0VHX1RPX0xJTihNYXRjaFN0cik7Ci0KLSAgICBpZiggbWF0Y2ggPT0gTUFUQ0hfU1VCU1RSICkKLSAgICB7Ci0gICAgICBzX2xlbmd0aCA9IHN0cmxlbihscE1hdGNoU3RyKTsKLSAgICAgIGlmKCAhc19sZW5ndGggKSByZXR1cm4gKGxwaGwtPkl0ZW1zQ291bnQpPzA6TEJfRVJSOwotICAgIH0KLSAgfQotCi0gIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCBGaXJzdCk7Ci0gIENvdW50ID0gMDsKLSAgd2hpbGUobHBscyAhPSBOVUxMKSAKLSAgewotICAgIGlmIChscGhsLT5IYXNTdHJpbmdzKSAKLSAgICB7Ci0gICAgICBpZiAoICggc19sZW5ndGggKT8gIWxzdHJuY21waTMyQShscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0ciwgc19sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgIDogIWxzdHJjbXBpMzJBKGxwbHMtPml0ZW1UZXh0LCBscE1hdGNoU3RyKSAgKSByZXR1cm4gQ291bnQ7CisgICAgICAgIGRpcy5DdGxUeXBlICAgICAgPSBPRFRfTElTVEJPWDsKKyAgICAgICAgZGlzLkN0bElEICAgICAgICA9IHduZC0+d0lEbWVudTsKKyAgICAgICAgZGlzLmh3bmRJdGVtICAgICA9IHduZC0+aHduZFNlbGY7CisgICAgICAgIGRpcy5pdGVtQWN0aW9uICAgPSBhY3Rpb247CisgICAgICAgIGRpcy5oREMgICAgICAgICAgPSBoZGM7CisgICAgICAgIGRpcy5pdGVtSUQgICAgICAgPSBpbmRleDsKKyAgICAgICAgZGlzLml0ZW1TdGF0ZSAgICA9IDA7CisgICAgICAgIGlmIChpdGVtICYmIGl0ZW0tPnNlbGVjdGVkKSBkaXMuaXRlbVN0YXRlIHw9IE9EU19TRUxFQ1RFRDsKKyAgICAgICAgaWYgKChkZXNjci0+Zm9jdXNfaXRlbSA9PSBpbmRleCkgJiYKKyAgICAgICAgICAgIChkZXNjci0+Y2FyZXRfb24pICYmCisgICAgICAgICAgICAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKSBkaXMuaXRlbVN0YXRlIHw9IE9EU19GT0NVUzsKKyAgICAgICAgaWYgKHduZC0+ZHdTdHlsZSAmIFdTX0RJU0FCTEVEKSBkaXMuaXRlbVN0YXRlIHw9IE9EU19ESVNBQkxFRDsKKyAgICAgICAgZGlzLml0ZW1EYXRhICAgICA9IGl0ZW0gPyBpdGVtLT5kYXRhIDogMDsKKyAgICAgICAgZGlzLnJjSXRlbSAgICAgICA9ICpyZWN0OworICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogZHJhd2l0ZW0gJWQgKCVzKSBhY3Rpb249JTAyeCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlPSUwMnggcmVjdD0lZCwlZC0lZCwlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgaXRlbSA/IGl0ZW0tPnN0ciA6ICIiLCBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzLml0ZW1TdGF0ZSwgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKKyAgICAgICAgU2VuZE1lc3NhZ2UzMkEoZGVzY3ItPm93bmVyLCBXTV9EUkFXSVRFTSwgd25kLT53SURtZW51LCAoTFBBUkFNKSZkaXMpOwogICAgIH0KICAgICBlbHNlCi0gICAgICBpZiAoIGxwbHMtPm1pcy5pdGVtRGF0YSA9PSAoRFdPUkQpbHBNYXRjaFN0ciApIHJldHVybiBDb3VudDsKLQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gICAgQ291bnQrKzsKLSAgfQotCi0gIC8qIFN0YXJ0IG92ZXIgYXQgdG9wICovCi0gIENvdW50ID0gMDsKLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0KLSAgd2hpbGUgKENvdW50IDwgRmlyc3QpIAotICB7Ci0gICAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpIAogICAgIHsKLSAgICAgIGlmICggKCBzX2xlbmd0aCApPyAhbHN0cm5jbXBpMzJBKGxwbHMtPml0ZW1UZXh0LCBscE1hdGNoU3RyLCBzX2xlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgOiAhbHN0cmNtcGkzMkEobHBscy0+aXRlbVRleHQsIGxwTWF0Y2hTdHIpICApIHJldHVybiBDb3VudDsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBPREFfRk9DVVMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERyYXdGb2N1c1JlY3QzMiggaGRjLCByZWN0ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS0+c2VsZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldEJrQ29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX0hJR0hMSUdIVCApICk7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX0hJR0hMSUdIVFRFWFQgKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfV0lORE9XICkgKTsKKyAgICAgICAgICAgIGlmICh3bmQtPmR3U3R5bGUgJiBXU19ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX0dSQVlURVhUICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoIGhkYywgR2V0U3lzQ29sb3IoIENPTE9SX1dJTkRPV1RFWFQgKSApOworICAgICAgICB9CisgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBwYWludGluZyAlZCAoJXMpIGFjdGlvbj0lMDJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWN0PSVkLCVkLSVkLCVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBpdGVtID8gaXRlbS0+c3RyIDogIiIsIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5sZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20gKTsKKyAgICAgICAgLyogRklYTUU6IGNoZWNrIExCU19VU0VUQUJTVE9QUyBzdHlsZSAqLworICAgICAgICBpZiAoaXRlbSkKKyAgICAgICAgICAgIEV4dFRleHRPdXQzMkEoIGhkYywgcmVjdC0+bGVmdCArIDEsIHJlY3QtPnRvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsIHJlY3QsIGl0ZW0tPnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpdGVtLT5zdHIpLCBOVUxMICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEV4dFRleHRPdXQzMkEoIGhkYywgcmVjdC0+bGVmdCArIDEsIHJlY3QtPnRvcCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsIHJlY3QsIE5VTEwsIDAsIE5VTEwgKTsKKyAgICAgICAgaWYgKChkZXNjci0+Zm9jdXNfaXRlbSA9PSBpbmRleCkgJiYKKyAgICAgICAgICAgIChkZXNjci0+Y2FyZXRfb24pICYmCisgICAgICAgICAgICAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKSBEcmF3Rm9jdXNSZWN0MzIoIGhkYywgcmVjdCApOwogICAgIH0KLSAgICBlbHNlCi0gICAgICBpZiAoIGxwbHMtPm1pcy5pdGVtRGF0YSA9PSAoRFdPUkQpbHBNYXRjaFN0ciApIHJldHVybiBDb3VudDsKLSAgICAKLSAgICBscGxzID0gbHBscy0+bHBOZXh0OwotICAgIENvdW50Kys7Ci0gIH0KLQotICByZXR1cm4gTEJfRVJSOwogfQogCi1pbnQgTGlzdEJveEZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1NldFJlZHJhdworICoKKyAqIENoYW5nZSB0aGUgcmVkcmF3IGZsYWcuCisgKi8KK3N0YXRpYyB2b2lkIExJU1RCT1hfU2V0UmVkcmF3KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBCT09MMzIgb24gKQogewotICByZXR1cm4gbGJGaW5kU3RyaW5nKGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIE1BVENIX1NVQlNUUiApOwotfQotCi1pbnQgTGlzdEJveEZpbmRTdHJpbmdFeGFjdChMUEhFQURMSVNUIGxwaGwsIFVJTlQgbkZpcnN0LCBTRUdQVFIgTWF0Y2hTdHIpCi17Ci0gIHJldHVybiBsYkZpbmRTdHJpbmcobHBobCwgbkZpcnN0LCBNYXRjaFN0ciwgTUFUQ0hfRVhBQ1QgKTsKLX0KLQotaW50IExpc3RCb3hSZXNldENvbnRlbnQoTFBIRUFETElTVCBscGhsKQotewotICAgIExQTElTVFNUUlVDVCBscGxzOwotICAgIGludCBpOwotCi0gICAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIDA7Ci0KLSAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdEJveFJlc2V0Q29udGVudCAvLyBJdGVtQ291bnQgPSAlZFxuIiwKLQlscGhsLT5JdGVtc0NvdW50KTsKLQotICAgIGZvcihpID0gMDsgaSA8IGxwaGwtPkl0ZW1zQ291bnQ7IGkrKykgewotICAgICAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0gICAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotCi0gICAgICBpZiAobHBobC0+T3duZXJEcmF3bikgbGJEZWxldGVJdGVtTm90aWZ5KGxwaGwsIGxwbHMpOwotCi0gICAgICBscGhsLT5scEZpcnN0ID0gbHBscy0+bHBOZXh0OwotICAgICAgaWYgKGxwbHMtPmhEYXRhICE9IDApIExJU1RfSEVBUF9GUkVFKGxwaGwsIGxwbHMtPmhEYXRhKTsKLSAgICAgIGZyZWUobHBscyk7CisgICAgaWYgKG9uKQorICAgIHsKKyAgICAgICAgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX05PUkVEUkFXKSkgcmV0dXJuOworICAgICAgICBkZXNjci0+c3R5bGUgJj0gfkxCU19OT1JFRFJBVzsKKyAgICAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKICAgICB9Ci0gICAgTGlzdEJveEluaXRpYWxpemUobHBobCk7CisgICAgZWxzZSBkZXNjci0+c3R5bGUgfD0gTEJTX05PUkVEUkFXOworfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfUmVwYWludEl0ZW0KKyAqCisgKiBSZXBhaW50IGEgc2luZ2xlIGl0ZW0gc3luY2hyb25vdXNseS4KKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9SZXBhaW50SXRlbSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgYWN0aW9uICkKK3sKKyAgICBIREMzMiBoZGM7CisgICAgUkVDVDMyIHJlY3Q7CisKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX05PUkVEUkFXKSByZXR1cm47CisgICAgaWYgKExJU1RCT1hfR2V0SXRlbVJlY3QoIHduZCwgZGVzY3IsIGluZGV4LCAmcmVjdCApICE9IDEpIHJldHVybjsKKyAgICBpZiAoKGhkYyA9IEdldERDRXgzMiggd25kLT5od25kU2VsZiwgMCwgRENYX0NBQ0hFICkpKQorICAgIHsKKyAgICAgICAgSEZPTlQzMiBvbGRGb250ID0gMDsKKyAgICAgICAgaWYgKGRlc2NyLT5mb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoIGhkYywgZGVzY3ItPmZvbnQgKTsKKyAgICAgICAgU2V0V2luZG93T3JnRXgzMiggaGRjLCBkZXNjci0+aG9yel9wb3MsIDAsIE5VTEwgKTsKKyAgICAgICAgTElTVEJPWF9QYWludEl0ZW0oIHduZCwgZGVzY3IsIGhkYywgJnJlY3QsIGluZGV4LCBhY3Rpb24gKTsKKyAgICAgICAgaWYgKG9sZEZvbnQpIFNlbGVjdE9iamVjdDMyKCBoZGMsIG9sZEZvbnQgKTsKKyAgICAgICAgUmVsZWFzZURDMzIoIHduZC0+aHduZFNlbGYsIGhkYyApOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0luaXRTdG9yYWdlCisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfSW5pdFN0b3JhZ2UoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIG5iX2l0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgYnl0ZXMgKQoreworICAgIExCX0lURU1EQVRBICppdGVtOworCisgICAgbmJfaXRlbXMgKz0gTEJfQVJSQVlfR1JBTlVMQVJJVFkgLSAxOworICAgIG5iX2l0ZW1zIC09IChuYl9pdGVtcyAlIExCX0FSUkFZX0dSQU5VTEFSSVRZKTsKKyAgICBpZiAoZGVzY3ItPml0ZW1zKQorICAgICAgICBuYl9pdGVtcyArPSBIZWFwU2l6ZSggZGVzY3ItPmhlYXAsIDAsIGRlc2NyLT5pdGVtcyApIC8gc2l6ZW9mKCppdGVtKTsKKyAgICBpZiAoIShpdGVtID0gSGVhcFJlQWxsb2MoIGRlc2NyLT5oZWFwLCAwLCBkZXNjci0+aXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9pdGVtcyAqIHNpemVvZihMQl9JVEVNREFUQSkgKSkpCisgICAgeworICAgICAgICBTRU5EX05PVElGSUNBVElPTiggd25kLCBkZXNjciwgTEJOX0VSUlNQQUNFICk7CisgICAgICAgIHJldHVybiBMQl9FUlJTUEFDRTsKKyAgICB9CisgICAgZGVzY3ItPml0ZW1zID0gaXRlbTsKKyAgICByZXR1cm4gTEJfT0tBWTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1NldFRhYlN0b3BzCisgKi8KK3N0YXRpYyBCT09MMzIgTElTVEJPWF9TZXRUYWJTdG9wcyggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMzIgdGFicywgQk9PTDMyIHNob3J0X2ludHMgKQoreworICAgIGlmICghKGRlc2NyLT5zdHlsZSAmIExCU19VU0VUQUJTVE9QUykpIHJldHVybiBUUlVFOworICAgIGlmIChkZXNjci0+dGFicykgSGVhcEZyZWUoIGRlc2NyLT5oZWFwLCAwLCBkZXNjci0+dGFicyApOworICAgIGlmICghKGRlc2NyLT5uYl90YWJzID0gY291bnQpKQorICAgIHsKKyAgICAgICAgZGVzY3ItPnRhYnMgPSBOVUxMOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgLyogRklYTUU6IGNvdW50ID0gMSAqLworICAgIGlmICghKGRlc2NyLT50YWJzID0gKElOVDMyICopSGVhcEFsbG9jKCBkZXNjci0+aGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPm5iX3RhYnMgKiBzaXplb2YoSU5UMzIpICkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKHNob3J0X2ludHMpCisgICAgeworICAgICAgICBJTlQzMiBpOworICAgICAgICBMUElOVDE2IHAgPSAoTFBJTlQxNil0YWJzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX3RhYnM7IGkrKykgZGVzY3ItPnRhYnNbaV0gPSAqcCsrOworICAgIH0KKyAgICBlbHNlIG1lbWNweSggZGVzY3ItPnRhYnMsIHRhYnMsIGRlc2NyLT5uYl90YWJzICogc2l6ZW9mKElOVDMyKSApOworICAgIC8qIEZJWE1FOiByZXBhaW50IHRoZSB3aW5kb3c/ICovCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZWxlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgTGlzdEJveFNldEN1clNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4KQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9HZXRUZXh0CisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfR2V0VGV4dCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciApCiB7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotCi0gIC8qIHVzZSBMaXN0Qm94U2V0U2VsIGluc3RlYWQgKi8KLSAgaWYgKGxwaGwtPmR3U3R5bGUgJiAoTEJTX01VTFRJUExFU0VMIHwgTEJTX0VYVEVOREVEU0VMKSApIHJldHVybiAwOwotCi0gIC8qIHVuc2VsZWN0IHByZXZpb3VzIGl0ZW0gKi8KLSAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkICE9IC0xKSB7Ci0gICAgbHBobC0+UHJldkZvY3VzZWQgPSBscGhsLT5JdGVtRm9jdXNlZDsKLSAgICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgbHBobC0+SXRlbUZvY3VzZWQpOwotICAgIGlmIChscGxzID09IDApIHJldHVybiBMQl9FUlI7Ci0gICAgbHBscy0+aXRlbVN0YXRlID0gMDsKLSAgfQotCi0gIGlmICgod0luZGV4ICE9IChVSU5UKS0xKSAmJiAod0luZGV4IDwgbHBobC0+SXRlbXNDb3VudCkpCi0gIHsKLSAgICBscGhsLT5JdGVtRm9jdXNlZCA9IHdJbmRleDsKLSAgICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgd0luZGV4KTsKLSAgICBpZiAobHBscyA9PSAwKSByZXR1cm4gTEJfRVJSOwotICAgIGxwbHMtPml0ZW1TdGF0ZSA9IE9EU19TRUxFQ1RFRCB8IE9EU19GT0NVUzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcmV0dXJuIExCX0VSUjsKLX0KLQotCi1pbnQgTGlzdEJveFNldFNlbChMUEhFQURMSVNUIGxwaGwsIFdPUkQgd0luZGV4LCBXT1JEIHN0YXRlKQotewotICBMUExJU1RTVFJVQ1QgIGxwbHM7Ci0gIGludCAgICAgICAgICAgbiA9IDA7Ci0KLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmICAoTEJTX01VTFRJUExFU0VMIHwgTEJTX0VYVEVOREVEU0VMKSAgKSkgCi0gICAgICAgIHJldHVybiBMQl9FUlI7Ci0KLSAgaWYgKHdJbmRleCA9PSAoVUlOVCktMSkgewotICAgIGZvciAobHBscyA9IGxwaGwtPmxwRmlyc3Q7IGxwbHMgIT0gTlVMTDsgbHBscyA9IGxwbHMtPmxwTmV4dCkgewotICAgICAgaWYoIGxwbHMtPml0ZW1TdGF0ZSAmIE9EU19TRUxFQ1RFRCkgbisrOwotICAgICAgbHBscy0+aXRlbVN0YXRlID0gc3RhdGU/IGxwbHMtPml0ZW1TdGF0ZSB8ICBPRFNfU0VMRUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBscGxzLT5pdGVtU3RhdGUgJiB+T0RTX1NFTEVDVEVEOworICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gZGVzY3ItPm5iX2l0ZW1zKSkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAoSEFTX1NUUklOR1MoZGVzY3IpKQorICAgIHsKKyAgICAgICAgbHN0cmNweTMyQSggYnVmZmVyLCBkZXNjci0+aXRlbXNbaW5kZXhdLnN0ciApOworICAgICAgICByZXR1cm4gc3RybGVuKGJ1ZmZlcik7CiAgICAgfQotICAgIHJldHVybiBuOwotICB9Ci0KLSAgaWYgKHdJbmRleCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwotCi0gIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOwotICBscGxzLT5pdGVtU3RhdGUgPSBzdGF0ZT8gbHBscy0+aXRlbVN0YXRlIHwgIE9EU19TRUxFQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgIDogbHBscy0+aXRlbVN0YXRlICYgfk9EU19TRUxFQ1RFRDsKLQotICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgJmRlc2NyLT5pdGVtc1tpbmRleF0uZGF0YSwgc2l6ZW9mKERXT1JEKSApOworICAgICAgICByZXR1cm4gc2l6ZW9mKERXT1JEKTsKKyAgICB9CiB9CiAKIAotaW50IExpc3RCb3hHZXRTZWwoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfRmluZFN0cmluZ1BvcworICoKKyAqIEZpbmQgdGhlIG5lYXJlc3Qgc3RyaW5nIGxvY2F0ZWQgYmVmb3JlIGEgZ2l2ZW4gc3RyaW5nIGluIHNvcnQgb3JkZXIuCisgKiBJZiAnZXhhY3QnIGlzIFRSVUUsIHJldHVybiBhbiBlcnJvciBpZiB3ZSBkb24ndCBnZXQgYW4gZXhhY3QgbWF0Y2guCisgKi8KK3N0YXRpYyBJTlQzMiBMSVNUQk9YX0ZpbmRTdHJpbmdQb3MoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIExQQ1NUUiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZXhhY3QgKQogewotICBMUExJU1RTVFJVQ1QgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsIHdJbmRleCk7CisgICAgSU5UMzIgaW5kZXgsIG1pbiwgbWF4LCByZXMgPSAtMTsKIAotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICByZXR1cm4gbHBscy0+aXRlbVN0YXRlICYgT0RTX1NFTEVDVEVEOworICAgIGlmICghKGRlc2NyLT5zdHlsZSAmIExCU19TT1JUKSkgcmV0dXJuIC0xOyAgLyogQWRkIGl0IGF0IHRoZSBlbmQgKi8KKyAgICBtaW4gPSAwOworICAgIG1heCA9IGRlc2NyLT5uYl9pdGVtczsKKyAgICB3aGlsZSAobWluICE9IG1heCkKKyAgICB7CisgICAgICAgIGluZGV4ID0gKG1pbiArIG1heCkgLyAyOworICAgICAgICBpZiAoSEFTX1NUUklOR1MoZGVzY3IpKQorICAgICAgICAgICAgcmVzID0gbHN0cmNtcGkzMkEoIGRlc2NyLT5pdGVtc1tpbmRleF0uc3RyLCBzdHIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDT01QQVJFSVRFTVNUUlVDVDMyIGNpczsKKyAgICAgICAgICAgIGNpcy5DdGxUeXBlICAgID0gT0RUX0xJU1RCT1g7CisgICAgICAgICAgICBjaXMuQ3RsSUQgICAgICA9IHduZC0+d0lEbWVudTsKKyAgICAgICAgICAgIGNpcy5od25kSXRlbSAgID0gd25kLT5od25kU2VsZjsKKyAgICAgICAgICAgIGNpcy5pdGVtSUQxICAgID0gaW5kZXg7CisgICAgICAgICAgICBjaXMuaXRlbURhdGExICA9IGRlc2NyLT5pdGVtc1tpbmRleF0uZGF0YTsKKyAgICAgICAgICAgIGNpcy5pdGVtSUQyICAgID0gLTE7CisgICAgICAgICAgICBjaXMuaXRlbURhdGEyICA9IChEV09SRClzdHI7CisgICAgICAgICAgICBjaXMuZHdMb2NhbGVJZCA9IGRlc2NyLT5sb2NhbGU7CisgICAgICAgICAgICByZXMgPSBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9DT01QQVJFSVRFTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmQtPndJRG1lbnUsIChMUEFSQU0pJmNpcyApOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzKSByZXR1cm4gaW5kZXg7CisgICAgICAgIGlmIChyZXMgPiAwKSBtYXggPSBpbmRleDsKKyAgICAgICAgZWxzZSBtaW4gPSBpbmRleCArIDE7CisgICAgfQorICAgIHJldHVybiBleGFjdCA/IC0xIDogbWF4OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpciBsaXN0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1MT05HIExpc3RCb3hEaXJlY3RvcnkoTFBIRUFETElTVCBscGhsLCBVSU5UIGF0dHJpYiwgTFBDU1RSIGZpbGVzcGVjKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9GaW5kRmlsZVN0clBvcworICoKKyAqIEZpbmQgdGhlIG5lYXJlc3Qgc3RyaW5nIGxvY2F0ZWQgYmVmb3JlIGEgZ2l2ZW4gc3RyaW5nIGluIGRpcmVjdG9yeQorICogc29ydCBvcmRlciAoaS5lLiBmaXJzdCBmaWxlcywgdGhlbiBkaXJlY3RvcmllcywgdGhlbiBkcml2ZXMpLgorICovCitzdGF0aWMgSU5UMzIgTElTVEJPWF9GaW5kRmlsZVN0clBvcyggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgTFBDU1RSIHN0ciApCiB7Ci0gICAgY2hhciAJbWFza1sxM107Ci0gICAgY2hhcioJdGVtcCA9IE5VTEw7Ci0gICAgY29uc3QgY2hhcioJcHRyOwotICAgIGludCAJc2tpcCwgY291bnQ7Ci0gICAgTE9ORyAJcmV0OwotICAgIERPU19ESVJFTlQgCWVudHJ5OworICAgIElOVDMyIG1pbiwgbWF4LCByZXMgPSAtMTsKKworICAgIGlmICghSEFTX1NUUklOR1MoZGVzY3IpKQorICAgICAgICByZXR1cm4gTElTVEJPWF9GaW5kU3RyaW5nUG9zKCB3bmQsIGRlc2NyLCBzdHIsIEZBTFNFICk7CisgICAgbWluID0gMDsKKyAgICBtYXggPSBkZXNjci0+bmJfaXRlbXM7CisgICAgd2hpbGUgKG1pbiAhPSBtYXgpCisgICAgeworICAgICAgICBJTlQzMiBpbmRleCA9IChtaW4gKyBtYXgpIC8gMjsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IGRlc2NyLT5pdGVtc1tpbmRleF0uc3RyOworICAgICAgICBpZiAoKnAgPT0gJ1snKSAgLyogZHJpdmUgb3IgZGlyZWN0b3J5ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqc3RyICE9ICdbJykgcmVzID0gLTE7CisgICAgICAgICAgICBlbHNlIGlmIChwWzFdID09ICctJykgIC8qIGRyaXZlICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0clsxXSA9PSAnLScpIHJlcyA9IHN0clsyXSAtIHBbMl07CisgICAgICAgICAgICAgICAgZWxzZSByZXMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8qIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJy0nKSByZXMgPSAxOworICAgICAgICAgICAgICAgIGVsc2UgcmVzID0gbHN0cmNtcGkzMkEoIHN0ciwgcCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgIC8qIGZpbGVuYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqc3RyID09ICdbJykgcmVzID0gMTsKKyAgICAgICAgICAgIGVsc2UgcmVzID0gbHN0cmNtcGkzMkEoIHN0ciwgcCApOworICAgICAgICB9CisgICAgICAgIGlmICghcmVzKSByZXR1cm4gaW5kZXg7CisgICAgICAgIGlmIChyZXMgPCAwKSBtYXggPSBpbmRleDsKKyAgICAgICAgZWxzZSBtaW4gPSBpbmRleCArIDE7CisgICAgfQorICAgIHJldHVybiBtYXg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9GaW5kU3RyaW5nCisgKgorICogRmluZCB0aGUgaXRlbSBiZWdpbm5pbmcgd2l0aCBhIGdpdmVuIHN0cmluZy4KKyAqLworc3RhdGljIElOVDMyIExJU1RCT1hfRmluZFN0cmluZyggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgc3RyLCBCT09MMzIgZXhhY3QgKQoreworICAgIElOVDMyIGk7CisgICAgTEJfSVRFTURBVEEgKml0ZW07CisKKyAgICBpZiAoc3RhcnQgPj0gZGVzY3ItPm5iX2l0ZW1zKSBzdGFydCA9IC0xOworICAgIGl0ZW0gPSBkZXNjci0+aXRlbXMgKyBzdGFydCArIDE7CisgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSkKKyAgICB7CisgICAgICAgIGlmIChleGFjdCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gc3RhcnQgKyAxOyBpIDwgZGVzY3ItPm5iX2l0ZW1zOyBpKyssIGl0ZW0rKykKKyAgICAgICAgICAgICAgICBpZiAoIWxzdHJjbXBpMzJBKCBzdHIsIGl0ZW0tPnN0ciApKSByZXR1cm4gaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGl0ZW0gPSBkZXNjci0+aXRlbXM7IGkgPD0gc3RhcnQ7IGkrKywgaXRlbSsrKQorICAgICAgICAgICAgICAgIGlmICghbHN0cmNtcGkzMkEoIHN0ciwgaXRlbS0+c3RyICkpIHJldHVybiBpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworIC8qIFNwZWNpYWwgY2FzZSBmb3IgZHJpdmVzIGFuZCBkaXJlY3RvcmllczogaWdub3JlIHByZWZpeCAqLworI2RlZmluZSBDSEVDS19EUklWRShpdGVtKSBcCisgICAgaWYgKChpdGVtKS0+c3RyWzBdID09ICdbJykgXAorICAgIHsgXAorICAgICAgICBpZiAoIWxzdHJuY21waTMyQSggc3RyLCAoaXRlbSktPnN0cisxLCBsZW4gKSkgcmV0dXJuIGk7IFwKKyAgICAgICAgaWYgKCgoaXRlbSktPnN0clsxXSA9PSAnLScpICYmICFsc3RybmNtcGkzMkEoc3RyLChpdGVtKS0+c3RyKzIsbGVuKSkgXAorICAgICAgICByZXR1cm4gaTsgXAorICAgIH0KKworICAgICAgICAgICAgSU5UMzIgbGVuID0gc3RybGVuKHN0cik7CisgICAgICAgICAgICBmb3IgKGkgPSBzdGFydCArIDE7IGkgPCBkZXNjci0+bmJfaXRlbXM7IGkrKywgaXRlbSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkzMkEoIHN0ciwgaXRlbS0+c3RyLCBsZW4gKSkgcmV0dXJuIGk7CisgICAgICAgICAgICAgICBDSEVDS19EUklWRShpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDAsIGl0ZW0gPSBkZXNjci0+aXRlbXM7IGkgPD0gc3RhcnQ7IGkrKywgaXRlbSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkzMkEoIHN0ciwgaXRlbS0+c3RyLCBsZW4gKSkgcmV0dXJuIGk7CisgICAgICAgICAgICAgICBDSEVDS19EUklWRShpdGVtKTsKKyAgICAgICAgICAgIH0KKyN1bmRlZiBDSEVDS19EUklWRQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChleGFjdCAmJiAoZGVzY3ItPnN0eWxlICYgTEJTX1NPUlQpKQorICAgICAgICAgICAgLyogSWYgc29ydGVkLCB1c2UgYSBXTV9DT01QQVJFSVRFTSBiaW5hcnkgc2VhcmNoICovCisgICAgICAgICAgICByZXR1cm4gTElTVEJPWF9GaW5kU3RyaW5nUG9zKCB3bmQsIGRlc2NyLCBzdHIsIFRSVUUgKTsKKworICAgICAgICAvKiBPdGhlcndpc2UgdXNlIGEgbGluZWFyIHNlYXJjaCAqLworICAgICAgICBmb3IgKGkgPSBzdGFydCArIDE7IGkgPCBkZXNjci0+bmJfaXRlbXM7IGkrKywgaXRlbSsrKQorICAgICAgICAgICAgaWYgKGl0ZW0tPmRhdGEgPT0gKERXT1JEKXN0cikgcmV0dXJuIGk7CisgICAgICAgIGZvciAoaSA9IDAsIGl0ZW0gPSBkZXNjci0+aXRlbXM7IGkgPD0gc3RhcnQ7IGkrKywgaXRlbSsrKQorICAgICAgICAgICAgaWYgKGl0ZW0tPmRhdGEgPT0gKERXT1JEKXN0cikgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiBMQl9FUlI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9HZXRTZWxDb3VudAorICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0dldFNlbENvdW50KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyICkKK3sKKyAgICBJTlQzMiBpLCBjb3VudDsKKyAgICBMQl9JVEVNREFUQSAqaXRlbSA9IGRlc2NyLT5pdGVtczsKKworICAgIGlmICghKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSVBMRVNFTCkpIHJldHVybiBMQl9FUlI7CisgICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgZGVzY3ItPm5iX2l0ZW1zOyBpKyssIGl0ZW0rKykKKyAgICAgICAgaWYgKGl0ZW0tPnNlbGVjdGVkKSBjb3VudCsrOworICAgIHJldHVybiBjb3VudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0dldFNlbEl0ZW1zMTYKKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9HZXRTZWxJdGVtczE2KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBJTlQxNiBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMTYgYXJyYXkgKQoreworICAgIElOVDMyIGksIGNvdW50OworICAgIExCX0lURU1EQVRBICppdGVtID0gZGVzY3ItPml0ZW1zOworCisgICAgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIExCX0VSUjsKKyAgICBmb3IgKGkgPSBjb3VudCA9IDA7IChpIDwgZGVzY3ItPm5iX2l0ZW1zKSAmJiAoY291bnQgPCBtYXgpOyBpKyssIGl0ZW0rKykKKyAgICAgICAgaWYgKGl0ZW0tPnNlbGVjdGVkKSBhcnJheVtjb3VudCsrXSA9IChJTlQxNilpOworICAgIHJldHVybiBjb3VudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0dldFNlbEl0ZW1zMzIKKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9HZXRTZWxJdGVtczMyKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBJTlQzMiBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSU5UMzIgYXJyYXkgKQoreworICAgIElOVDMyIGksIGNvdW50OworICAgIExCX0lURU1EQVRBICppdGVtID0gZGVzY3ItPml0ZW1zOworCisgICAgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIExCX0VSUjsKKyAgICBmb3IgKGkgPSBjb3VudCA9IDA7IChpIDwgZGVzY3ItPm5iX2l0ZW1zKSAmJiAoY291bnQgPCBtYXgpOyBpKyssIGl0ZW0rKykKKyAgICAgICAgaWYgKGl0ZW0tPnNlbGVjdGVkKSBhcnJheVtjb3VudCsrXSA9IGk7CisgICAgcmV0dXJuIGNvdW50OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfUGFpbnQKKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9QYWludCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSERDMzIgaGRjICkKK3sKKyAgICBJTlQzMiBpLCBjb2xfcG9zID0gZGVzY3ItPnBhZ2Vfc2l6ZSAtIDE7CisgICAgUkVDVDMyIHJlY3Q7CisgICAgSEZPTlQzMiBvbGRGb250ID0gMDsKKworICAgIFNldFJlY3QzMiggJnJlY3QsIDAsIDAsIGRlc2NyLT53aWR0aCwgZGVzY3ItPmhlaWdodCApOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9SRURSQVcpIHJldHVybiAwOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgIGVsc2UgaWYgKGRlc2NyLT5ob3J6X3BvcykKKyAgICB7CisgICAgICAgIFNldFdpbmRvd09yZ0V4MzIoIGhkYywgZGVzY3ItPmhvcnpfcG9zLCAwLCBOVUxMICk7CisgICAgICAgIHJlY3QucmlnaHQgKz0gZGVzY3ItPmhvcnpfcG9zOworICAgIH0KKworICAgIGlmIChkZXNjci0+Zm9udCkgb2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGRlc2NyLT5mb250ICk7CisKKyAgICBpZiAoIWRlc2NyLT5uYl9pdGVtcyAmJiAoZGVzY3ItPmZvY3VzX2l0ZW0gIT0gLTEpICYmIGRlc2NyLT5jYXJldF9vbiAmJgorICAgICAgICAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKQorICAgIHsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBsaXN0Ym94OiBwYWludCBmb2N1cyByZWN0ICovCisgICAgICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyBkZXNjci0+aXRlbV9oZWlnaHQ7CisgICAgICAgIExJU1RCT1hfUGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBoZGMsICZyZWN0LCBkZXNjci0+Zm9jdXNfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9EQV9EUkFXRU5USVJFICk7CisgICAgICAgIHJlY3QudG9wID0gcmVjdC5ib3R0b207CisgICAgfQorCisgICAgZm9yIChpID0gZGVzY3ItPnRvcF9pdGVtOyBpIDwgZGVzY3ItPm5iX2l0ZW1zOyBpKyspCisgICAgeworICAgICAgICBpZiAoIShkZXNjci0+c3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpKQorICAgICAgICAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGRlc2NyLT5pdGVtX2hlaWdodDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGRlc2NyLT5pdGVtc1tpXS5oZWlnaHQ7CisKKyAgICAgICAgTElTVEJPWF9QYWludEl0ZW0oIHduZCwgZGVzY3IsIGhkYywgJnJlY3QsIGksIE9EQV9EUkFXRU5USVJFICk7CisgICAgICAgIHJlY3QudG9wID0gcmVjdC5ib3R0b207CisKKyAgICAgICAgaWYgKChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pICYmICFjb2xfcG9zKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlTX09XTkVSRFJBVyhkZXNjcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGJvdHRvbSBvZiB0aGUgY29sdW1uICovCisgICAgICAgICAgICAgICAgU2V0QmtDb2xvciggaGRjLCBHZXRTeXNDb2xvciggQ09MT1JfV0lORE9XICkgKTsKKyAgICAgICAgICAgICAgICBpZiAocmVjdC50b3AgPCBkZXNjci0+aGVpZ2h0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBkZXNjci0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBFeHRUZXh0T3V0MzJBKCBoZGMsIDAsIDAsIEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIE5VTEwsIDAsIE5VTEwgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEdvIHRvIHRoZSBuZXh0IGNvbHVtbiAqLworICAgICAgICAgICAgcmVjdC5sZWZ0ICs9IGRlc2NyLT5jb2x1bW5fd2lkdGg7CisgICAgICAgICAgICByZWN0LnJpZ2h0ICs9IGRlc2NyLT5jb2x1bW5fd2lkdGg7CisgICAgICAgICAgICByZWN0LnRvcCA9IDA7CisgICAgICAgICAgICBjb2xfcG9zID0gZGVzY3ItPnBhZ2Vfc2l6ZSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb2xfcG9zLS07CisgICAgICAgICAgICBpZiAocmVjdC50b3AgPj0gZGVzY3ItPmhlaWdodCkgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIUlTX09XTkVSRFJBVyhkZXNjcikpCisgICAgeworICAgICAgICAvKiBDbGVhciB0aGUgcmVtYWluZGVyIG9mIHRoZSBjbGllbnQgYXJlYSAqLworICAgICAgICBTZXRCa0NvbG9yKCBoZGMsIEdldFN5c0NvbG9yKCBDT0xPUl9XSU5ET1cgKSApOworICAgICAgICBpZiAocmVjdC50b3AgPCBkZXNjci0+aGVpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByZWN0LmJvdHRvbSA9IGRlc2NyLT5oZWlnaHQ7CisgICAgICAgICAgICBFeHRUZXh0T3V0MzJBKCBoZGMsIDAsIDAsIEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0LCBOVUxMLCAwLCBOVUxMICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlY3QucmlnaHQgPCBkZXNjci0+d2lkdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlY3QubGVmdCAgID0gcmVjdC5yaWdodDsKKyAgICAgICAgICAgIHJlY3QucmlnaHQgID0gZGVzY3ItPndpZHRoOworICAgICAgICAgICAgcmVjdC50b3AgICAgPSAwOworICAgICAgICAgICAgcmVjdC5ib3R0b20gPSBkZXNjci0+aGVpZ2h0OworICAgICAgICAgICAgRXh0VGV4dE91dDMyQSggaGRjLCAwLCAwLCBFVE9fT1BBUVVFIHwgRVRPX0NMSVBQRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgTlVMTCwgMCwgTlVMTCApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvbGRGb250KSBTZWxlY3RPYmplY3QzMiggaGRjLCBvbGRGb250ICk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9JbnZhbGlkYXRlSXRlbXMKKyAqCisgKiBJbnZhbGlkYXRlIGFsbCBpdGVtcyBmcm9tIGEgZ2l2ZW4gaXRlbS4gSWYgdGhlIHNwZWNpZmllZCBpdGVtIGlzIG5vdAorICogdmlzaWJsZSwgbm90aGluZyBoYXBwZW5zLgorICovCitzdGF0aWMgdm9pZCBMSVNUQk9YX0ludmFsaWRhdGVJdGVtcyggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXggKQoreworICAgIFJFQ1QzMiByZWN0OworCisgICAgaWYgKExJU1RCT1hfR2V0SXRlbVJlY3QoIHduZCwgZGVzY3IsIGluZGV4LCAmcmVjdCApID09IDEpCisgICAgeworICAgICAgICByZWN0LmJvdHRvbSA9IGRlc2NyLT5oZWlnaHQ7CisgICAgICAgIEludmFsaWRhdGVSZWN0MzIoIHduZC0+aHduZFNlbGYsICZyZWN0LCBUUlVFICk7CisgICAgICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlcGFpbnQgdGhlIG90aGVyIGNvbHVtbnMgKi8KKyAgICAgICAgICAgIHJlY3QubGVmdCAgPSByZWN0LnJpZ2h0OworICAgICAgICAgICAgcmVjdC5yaWdodCA9IGRlc2NyLT53aWR0aDsKKyAgICAgICAgICAgIHJlY3QudG9wICAgPSAwOworICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiggd25kLT5od25kU2VsZiwgJnJlY3QsIFRSVUUgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0dldEl0ZW1IZWlnaHQKKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9HZXRJdGVtSGVpZ2h0KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBJTlQzMiBpbmRleCApCit7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkKKyAgICB7CisgICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gZGVzY3ItPm5iX2l0ZW1zKSkgcmV0dXJuIExCX0VSUjsKKyAgICAgICAgcmV0dXJuIGRlc2NyLT5pdGVtc1tpbmRleF0uaGVpZ2h0OworICAgIH0KKyAgICBlbHNlIHJldHVybiBkZXNjci0+aXRlbV9oZWlnaHQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9TZXRJdGVtSGVpZ2h0CisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfU2V0SXRlbUhlaWdodCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBoZWlnaHQgKQoreworICAgIGlmICghaGVpZ2h0KSBoZWlnaHQgPSAxOworCisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkKKyAgICB7CisgICAgICAgIGlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gZGVzY3ItPm5iX2l0ZW1zKSkgcmV0dXJuIExCX0VSUjsKKyAgICAgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IGl0ZW0gJWQgaGVpZ2h0ID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgaW5kZXgsIGhlaWdodCApOworICAgICAgICBkZXNjci0+aXRlbXNbaW5kZXhdLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgTElTVEJPWF9VcGRhdGVTY3JvbGwoIHduZCwgZGVzY3IgKTsKKyAgICAgICAgTElTVEJPWF9JbnZhbGlkYXRlSXRlbXMoIHduZCwgZGVzY3IsIGluZGV4ICk7CisgICAgfQorICAgIGVsc2UgaWYgKGhlaWdodCAhPSBkZXNjci0+aXRlbV9oZWlnaHQpCisgICAgeworICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogbmV3IGhlaWdodCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGhlaWdodCApOworICAgICAgICBkZXNjci0+aXRlbV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIExJU1RCT1hfVXBkYXRlUGFnZSggd25kLCBkZXNjciApOworICAgICAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbCggd25kLCBkZXNjciApOworICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCB3bmQtPmh3bmRTZWxmLCAwLCBUUlVFICk7CisgICAgfQorICAgIHJldHVybiBMQl9PS0FZOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcworICovCitzdGF0aWMgdm9pZCBMSVNUQk9YX1NldEhvcml6b250YWxQb3MoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIHBvcyApCit7CisgICAgSU5UMzIgZGlmZjsKKworICAgIGlmIChwb3MgPiBkZXNjci0+aG9yel9leHRlbnQgLSBkZXNjci0+d2lkdGgpCisgICAgICAgIHBvcyA9IGRlc2NyLT5ob3J6X2V4dGVudCAtIGRlc2NyLT53aWR0aDsKKyAgICBpZiAocG9zIDwgMCkgcG9zID0gMDsKKyAgICBpZiAoIShkaWZmID0gZGVzY3ItPmhvcnpfcG9zIC0gcG9zKSkgcmV0dXJuOworICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBuZXcgaG9yeiBwb3MgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIHBvcyApOworICAgIGRlc2NyLT5ob3J6X3BvcyA9IHBvczsKKyAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbCggd25kLCBkZXNjciApOworICAgIGlmIChhYnMoZGlmZikgPCBkZXNjci0+d2lkdGgpCisgICAgICAgIFNjcm9sbFdpbmRvdzMyKCB3bmQtPmh3bmRTZWxmLCBkaWZmLCAwLCBOVUxMLCBOVUxMICk7CisgICAgZWxzZQorICAgICAgICBJbnZhbGlkYXRlUmVjdDMyKCB3bmQtPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9TZXRIb3Jpem9udGFsRXh0ZW50CisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfU2V0SG9yaXpvbnRhbEV4dGVudCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGV4dGVudCApCit7CisgICAgaWYgKCFkZXNjci0+aG9yel9leHRlbnQgfHwgKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSUNPTFVNTikpCisgICAgICAgIHJldHVybiBMQl9PS0FZOworICAgIGlmIChleHRlbnQgPD0gMCkgZXh0ZW50ID0gMTsKKyAgICBpZiAoZXh0ZW50ID09IGRlc2NyLT5ob3J6X2V4dGVudCkgcmV0dXJuIExCX09LQVk7CisgICAgZHByaW50Zl9saXN0Ym94KCBzdGRkZWIsICJMaXN0Ym94ICUwNHg6IG5ldyBob3J6IGV4dGVudCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgZXh0ZW50ICk7CisgICAgZGVzY3ItPmhvcnpfZXh0ZW50ID0gZXh0ZW50OworICAgIGlmIChkZXNjci0+aG9yel9wb3MgPiBleHRlbnQgLSBkZXNjci0+d2lkdGgpCisgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwgZXh0ZW50IC0gZGVzY3ItPndpZHRoICk7CisgICAgZWxzZQorICAgICAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbCggd25kLCBkZXNjciApOworICAgIHJldHVybiBMQl9PS0FZOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfU2V0Q29sdW1uV2lkdGgKKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9TZXRDb2x1bW5XaWR0aCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgVUlOVDMyIHdpZHRoKQoreworICAgIHdpZHRoICs9IDI7ICAvKiBGb3IgbGVmdCBhbmQgcmlnaHQgbWFyZ2luICovCisgICAgaWYgKHdpZHRoID09IGRlc2NyLT5jb2x1bW5fd2lkdGgpIHJldHVybiBMQl9PS0FZOworICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBuZXcgY29sdW1uIHdpZHRoID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCB3aWR0aCApOworICAgIGRlc2NyLT5jb2x1bW5fd2lkdGggPSB3aWR0aDsKKyAgICBMSVNUQk9YX1VwZGF0ZVBhZ2UoIHduZCwgZGVzY3IgKTsKKyAgICByZXR1cm4gTEJfT0tBWTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1NldEZvbnQKKyAqCisgKiBSZXR1cm5zIHRoZSBpdGVtIGhlaWdodC4KKyAqLworc3RhdGljIElOVDMyIExJU1RCT1hfU2V0Rm9udCggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSEZPTlQzMiBmb250ICkKK3sKKyAgICBIREMzMiBoZGM7CisgICAgSEZPTlQzMiBvbGRGb250ID0gMDsKKyAgICBURVhUTUVUUklDMzJBIHRtOworCisgICAgZGVzY3ItPmZvbnQgPSBmb250OworCisgICAgaWYgKCEoaGRjID0gR2V0RENFeDMyKCB3bmQtPmh3bmRTZWxmLCAwLCBEQ1hfQ0FDSEUgKSkpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJMSVNUQk9YX1NldEZvbnQ6IHVuYWJsZSB0byBnZXQgRENcbiIgKTsKKyAgICAgICAgcmV0dXJuIDE2OworICAgIH0KKyAgICBpZiAoZm9udCkgb2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKCBoZGMsIGZvbnQgKTsKKyAgICBHZXRUZXh0TWV0cmljczMyQSggaGRjLCAmdG0gKTsKKyAgICBpZiAob2xkRm9udCkgU2VsZWN0T2JqZWN0MzIoIGhkYywgb2xkRm9udCApOworICAgIFJlbGVhc2VEQzMyKCB3bmQtPmh3bmRTZWxmLCBoZGMgKTsKKyAgICBpZiAoIUlTX09XTkVSRFJBVyhkZXNjcikpCisgICAgICAgIExJU1RCT1hfU2V0SXRlbUhlaWdodCggd25kLCBkZXNjciwgMCwgdG0udG1IZWlnaHQgKyAyICk7CisgICAgcmV0dXJuIHRtLnRtSGVpZ2h0ICsgMjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX01ha2VJdGVtVmlzaWJsZQorICoKKyAqIE1ha2Ugc3VyZSB0aGF0IGEgZ2l2ZW4gaXRlbSBpcyBwYXJ0aWFsbHkgb3IgZnVsbHkgdmlzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9NYWtlSXRlbVZpc2libGUoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmdWxseSApCit7CisgICAgSU5UMzIgdG9wOworCisgICAgaWYgKGluZGV4IDw9IGRlc2NyLT50b3BfaXRlbSkgdG9wID0gaW5kZXg7CisgICAgZWxzZSBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgIHsKKyAgICAgICAgSU5UMzIgY29scyA9IGRlc2NyLT53aWR0aDsKKyAgICAgICAgaWYgKCFmdWxseSkgY29scyArPSBkZXNjci0+Y29sdW1uX3dpZHRoIC0gMTsKKyAgICAgICAgaWYgKGNvbHMgPj0gZGVzY3ItPmNvbHVtbl93aWR0aCkgY29scyAvPSBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgICAgICBlbHNlIGNvbHMgPSAxOworICAgICAgICBpZiAoaW5kZXggPCBkZXNjci0+dG9wX2l0ZW0gKyAoZGVzY3ItPnBhZ2Vfc2l6ZSAqIGNvbHMpKSByZXR1cm47CisgICAgICAgIHRvcCA9IGluZGV4IC0gZGVzY3ItPnBhZ2Vfc2l6ZSAqIChjb2xzIC0gMSk7CisgICAgfQorICAgIGVsc2UgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkKKyAgICB7CisgICAgICAgIElOVDMyIGhlaWdodCA9IGZ1bGx5ID8gZGVzY3ItPml0ZW1zW2luZGV4XS5oZWlnaHQgOiAxOworICAgICAgICBmb3IgKHRvcCA9IGluZGV4OyB0b3AgPiBkZXNjci0+dG9wX2l0ZW07IHRvcC0tKQorICAgICAgICAgICAgaWYgKChoZWlnaHQgKz0gZGVzY3ItPml0ZW1zW3RvcC0xXS5oZWlnaHQpID4gZGVzY3ItPmhlaWdodCkgYnJlYWs7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChpbmRleCA8IGRlc2NyLT50b3BfaXRlbSArIGRlc2NyLT5wYWdlX3NpemUpIHJldHVybjsKKyAgICAgICAgaWYgKCFmdWxseSAmJiAoaW5kZXggPT0gZGVzY3ItPnRvcF9pdGVtICsgZGVzY3ItPnBhZ2Vfc2l6ZSkgJiYKKyAgICAgICAgICAgIChkZXNjci0+aGVpZ2h0ID4gKGRlc2NyLT5wYWdlX3NpemUgKiBkZXNjci0+aXRlbV9oZWlnaHQpKSkgcmV0dXJuOworICAgICAgICB0b3AgPSBpbmRleCAtIGRlc2NyLT5wYWdlX3NpemUgKyAxOworICAgIH0KKyAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIHRvcCwgVFJVRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfU2VsZWN0SXRlbVJhbmdlCisgKgorICogU2VsZWN0IGEgcmFuZ2Ugb2YgaXRlbXMuIFNob3VsZCBvbmx5IGJlIHVzZWQgb24gYSBNVUxUSVBMRVNFTCBsaXN0Ym94LgorICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX1NlbGVjdEl0ZW1SYW5nZSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgbGFzdCwgQk9PTDMyIG9uICkKK3sKKyAgICBJTlQzMiBpOworCisgICAgLyogQSBmZXcgc2FuaXR5IGNoZWNrcyAqLworCisgICAgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAobGFzdCA9PSAtMSkgbGFzdCA9IGRlc2NyLT5uYl9pdGVtcyAtIDE7CisgICAgaWYgKChmaXJzdCA8IDApIHx8IChmaXJzdCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gTEJfRVJSOworICAgIGlmICgobGFzdCA8IDApIHx8IChsYXN0ID49IGRlc2NyLT5uYl9pdGVtcykpIHJldHVybiBMQl9FUlI7CisgICAgLyogc2VsZWN0ZWRfaXRlbSByZWZsZWN0cyBsYXN0IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgaXRlbSBvbiBtdWx0aXBsZSBzZWwgKi8KKyAgICBkZXNjci0+c2VsZWN0ZWRfaXRlbSA9IGxhc3Q7CisKKyAgICBpZiAob24pICAvKiBUdXJuIHNlbGVjdGlvbiBvbiAqLworICAgIHsKKyAgICAgICAgZm9yIChpID0gZmlyc3Q7IGkgPD0gbGFzdDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVzY3ItPml0ZW1zW2ldLnNlbGVjdGVkKSBjb250aW51ZTsKKyAgICAgICAgICAgIGRlc2NyLT5pdGVtc1tpXS5zZWxlY3RlZCA9IFRSVUU7CisgICAgICAgICAgICBMSVNUQk9YX1JlcGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBpLCBPREFfU0VMRUNUICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAgLyogVHVybiBzZWxlY3Rpb24gb2ZmICovCisgICAgeworICAgICAgICBmb3IgKGkgPSBmaXJzdDsgaSA8PSBsYXN0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghZGVzY3ItPml0ZW1zW2ldLnNlbGVjdGVkKSBjb250aW51ZTsKKyAgICAgICAgICAgIGRlc2NyLT5pdGVtc1tpXS5zZWxlY3RlZCA9IEZBTFNFOworICAgICAgICAgICAgTElTVEJPWF9SZXBhaW50SXRlbSggd25kLCBkZXNjciwgaSwgT0RBX1NFTEVDVCApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKQorICAgICAgICBTRU5EX05PVElGSUNBVElPTiggd25kLCBkZXNjciwgTEJOX1NFTENIQU5HRSApOworICAgIHJldHVybiBMQl9PS0FZOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfU2V0Q2FyZXRJbmRleAorICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX1NldENhcmV0SW5kZXgoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgZnVsbHlfdmlzaWJsZSApCit7CisgICAgSU5UMzIgb2xkZm9jdXMgPSBkZXNjci0+Zm9jdXNfaXRlbTsKKworICAgIGlmICgoaW5kZXggPCAtMSkgfHwgKGluZGV4ID49IGRlc2NyLT5uYl9pdGVtcykpIHJldHVybiBMQl9FUlI7CisgICAgaWYgKGluZGV4ID09IG9sZGZvY3VzKSByZXR1cm4gTEJfT0tBWTsKKyAgICBkZXNjci0+Zm9jdXNfaXRlbSA9IGluZGV4OworICAgIGlmICgob2xkZm9jdXMgIT0gLTEpICYmIGRlc2NyLT5jYXJldF9vbiAmJiAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKQorICAgICAgICBMSVNUQk9YX1JlcGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBvbGRmb2N1cywgT0RBX0ZPQ1VTICk7CisgICAgaWYgKGluZGV4ICE9IC0xKQorICAgIHsKKyAgICAgICAgTElTVEJPWF9NYWtlSXRlbVZpc2libGUoIHduZCwgZGVzY3IsIGluZGV4LCBmdWxseV92aXNpYmxlICk7CisgICAgICAgIGlmIChkZXNjci0+Y2FyZXRfb24gJiYgKEdldEZvY3VzMzIoKSA9PSB3bmQtPmh3bmRTZWxmKSkKKyAgICAgICAgICAgIExJU1RCT1hfUmVwYWludEl0ZW0oIHduZCwgZGVzY3IsIGluZGV4LCBPREFfRk9DVVMgKTsKKyAgICB9CisgICAgcmV0dXJuIExCX09LQVk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9TZXRTZWxlY3Rpb24KKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9TZXRTZWxlY3Rpb24oIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBvbiwgQk9PTDMyIHNlbmRfbm90aWZ5ICkKK3sKKyAgICBpZiAoKGluZGV4IDwgLTEpIHx8IChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gTEJfRVJSOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpCisgICAgeworICAgICAgICBpZiAoaW5kZXggPT0gLTEpICAvKiBTZWxlY3QgYWxsIGl0ZW1zICovCisgICAgICAgICAgICByZXR1cm4gTElTVEJPWF9TZWxlY3RJdGVtUmFuZ2UoIHduZCwgZGVzY3IsIDAsIC0xLCBvbiApOworICAgICAgICBlbHNlICAvKiBPbmx5IG9uZSBpdGVtICovCisgICAgICAgICAgICByZXR1cm4gTElTVEJPWF9TZWxlY3RJdGVtUmFuZ2UoIHduZCwgZGVzY3IsIGluZGV4LCBpbmRleCwgb24gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgSU5UMzIgb2xkc2VsID0gZGVzY3ItPnNlbGVjdGVkX2l0ZW07CisgICAgICAgIGlmIChpbmRleCA9PSBvbGRzZWwpIHJldHVybiBMQl9PS0FZOworICAgICAgICBpZiAob2xkc2VsICE9IC0xKSBkZXNjci0+aXRlbXNbb2xkc2VsXS5zZWxlY3RlZCA9IEZBTFNFOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIGRlc2NyLT5pdGVtc1tpbmRleF0uc2VsZWN0ZWQgPSBUUlVFOworICAgICAgICBkZXNjci0+c2VsZWN0ZWRfaXRlbSA9IGluZGV4OworLyogRklYTUUgICAgaWYgKGluZGV4ICE9IC0xKSBMSVNUQk9YX01ha2VJdGVtVmlzaWJsZSggd25kLCBkZXNjciwgaW5kZXggKTsqLworICAgICAgICBpZiAob2xkc2VsICE9IC0xKSBMSVNUQk9YX1JlcGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBvbGRzZWwsIE9EQV9TRUxFQ1QpOworICAgICAgICBpZiAoaW5kZXggIT0gLTEpIExJU1RCT1hfUmVwYWludEl0ZW0oIHduZCwgZGVzY3IsIGluZGV4LCBPREFfU0VMRUNUICk7CisgICAgICAgIGlmIChzZW5kX25vdGlmeSkgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ICE9IC0xKSA/IExCTl9TRUxDSEFOR0UgOiBMQk5fU0VMQ0FOQ0VMICk7CisgICAgfQorICAgIHJldHVybiBMQl9PS0FZOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfTW92ZUNhcmV0CisgKgorICogQ2hhbmdlIHRoZSBjYXJldCBwb3NpdGlvbiBhbmQgZXh0ZW5kIHRoZSBzZWxlY3Rpb24gdG8gdGhlIG5ldyBjYXJldC4KKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9Nb3ZlQ2FyZXQoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBmdWxseV92aXNpYmxlICkKK3sKKyAgICBMSVNUQk9YX1NldENhcmV0SW5kZXgoIHduZCwgZGVzY3IsIGluZGV4LCBmdWxseV92aXNpYmxlICk7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19FWFRFTkRFRFNFTCkKKyAgICB7CisgICAgICAgIGlmIChkZXNjci0+YW5jaG9yX2l0ZW0gIT0gLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIElOVDMyIGZpcnN0ID0gTUlOKCBkZXNjci0+Zm9jdXNfaXRlbSwgZGVzY3ItPmFuY2hvcl9pdGVtICk7CisgICAgICAgICAgICBJTlQzMiBsYXN0ICA9IE1BWCggZGVzY3ItPmZvY3VzX2l0ZW0sIGRlc2NyLT5hbmNob3JfaXRlbSApOworICAgICAgICAgICAgaWYgKGZpcnN0ID4gMCkKKyAgICAgICAgICAgICAgICBMSVNUQk9YX1NlbGVjdEl0ZW1SYW5nZSggd25kLCBkZXNjciwgMCwgZmlyc3QgLSAxLCBGQUxTRSApOworICAgICAgICAgICAgTElTVEJPWF9TZWxlY3RJdGVtUmFuZ2UoIHduZCwgZGVzY3IsIGZpcnN0LCBsYXN0LCBUUlVFICk7CisgICAgICAgICAgICBMSVNUQk9YX1NlbGVjdEl0ZW1SYW5nZSggd25kLCBkZXNjciwgbGFzdCArIDEsIC0xLCBGQUxTRSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCEoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKSAmJiAoZGVzY3ItPnNlbGVjdGVkX2l0ZW0gIT0gLTEpKQorICAgIHsKKyAgICAgICAgLyogU2V0IHNlbGVjdGlvbiB0byBuZXcgY2FyZXQgaXRlbSAqLworICAgICAgICBMSVNUQk9YX1NldFNlbGVjdGlvbiggd25kLCBkZXNjciwgaW5kZXgsIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkgIT0gMCApOworICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0luc2VydEl0ZW0KKyAqLworc3RhdGljIExSRVNVTFQgTElTVEJPWF9JbnNlcnRJdGVtKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBJTlQzMiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgc3RyLCBEV09SRCBkYXRhICkKK3sKKyAgICBMQl9JVEVNREFUQSAqaXRlbTsKKyAgICBJTlQzMiBtYXhfaXRlbXM7CisKKyAgICBpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gZGVzY3ItPm5iX2l0ZW1zOworICAgIGVsc2UgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+IGRlc2NyLT5uYl9pdGVtcykpIHJldHVybiBMQl9FUlI7CisgICAgaWYgKCFkZXNjci0+aXRlbXMpIG1heF9pdGVtcyA9IDA7CisgICAgZWxzZSBtYXhfaXRlbXMgPSBIZWFwU2l6ZSggZGVzY3ItPmhlYXAsIDAsIGRlc2NyLT5pdGVtcyApIC8gc2l6ZW9mKCppdGVtKTsKKyAgICBpZiAoZGVzY3ItPm5iX2l0ZW1zID09IG1heF9pdGVtcykKKyAgICB7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXkgKi8KKyAgICAgICAgbWF4X2l0ZW1zICs9IExCX0FSUkFZX0dSQU5VTEFSSVRZOworICAgICAgICBpZiAoIShpdGVtID0gSGVhcFJlQWxsb2MoIGRlc2NyLT5oZWFwLCAwLCBkZXNjci0+aXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2l0ZW1zICogc2l6ZW9mKExCX0lURU1EQVRBKSApKSkKKyAgICAgICAgeworICAgICAgICAgICAgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsIExCTl9FUlJTUEFDRSApOworICAgICAgICAgICAgcmV0dXJuIExCX0VSUlNQQUNFOworICAgICAgICB9CisgICAgICAgIGRlc2NyLT5pdGVtcyA9IGl0ZW07CisgICAgfQorCisgICAgLyogSW5zZXJ0IHRoZSBpdGVtIHN0cnVjdHVyZSAqLworCisgICAgaXRlbSA9ICZkZXNjci0+aXRlbXNbaW5kZXhdOworICAgIGlmIChpbmRleCA8IGRlc2NyLT5uYl9pdGVtcykKKyAgICAgICAgUnRsTW92ZU1lbW9yeSggaXRlbSArIDEsIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+bmJfaXRlbXMgLSBpbmRleCkgKiBzaXplb2YoTEJfSVRFTURBVEEpICk7CisgICAgaXRlbS0+c3RyICAgICAgPSBzdHI7CisgICAgaXRlbS0+ZGF0YSAgICAgPSBkYXRhOworICAgIGl0ZW0tPmhlaWdodCAgID0gMDsKKyAgICBpdGVtLT5zZWxlY3RlZCA9IEZBTFNFOworICAgIGRlc2NyLT5uYl9pdGVtcysrOworCisgICAgLyogR2V0IGl0ZW0gaGVpZ2h0ICovCisKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQorICAgIHsKKyAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QzMiBtaXM7CisgICAgICAgIG1pcy5DdGxUeXBlICAgID0gT0RUX0xJU1RCT1g7CisgICAgICAgIG1pcy5DdGxJRCAgICAgID0gd25kLT53SURtZW51OworICAgICAgICBtaXMuaXRlbUlEICAgICA9IGluZGV4OworICAgICAgICBtaXMuaXRlbURhdGEgICA9IGRlc2NyLT5pdGVtc1tpbmRleF0uZGF0YTsKKyAgICAgICAgbWlzLml0ZW1IZWlnaHQgPSBkZXNjci0+aXRlbV9oZWlnaHQ7CisgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIFdNX01FQVNVUkVJVEVNLCB3bmQtPndJRG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKSZtaXMgKTsKKyAgICAgICAgaXRlbS0+aGVpZ2h0ID0gbWlzLml0ZW1IZWlnaHQgPyBtaXMuaXRlbUhlaWdodCA6IDE7CisgICAgICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBtZWFzdXJlIGl0ZW0gJWQgKCVzKSA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHduZC0+aHduZFNlbGYsIGluZGV4LCBzdHIgPyBzdHIgOiAiIiwgaXRlbS0+aGVpZ2h0ICk7CisgICAgfQorCisgICAgLyogUmVwYWludCB0aGUgaXRlbXMgKi8KKworICAgIExJU1RCT1hfVXBkYXRlU2Nyb2xsKCB3bmQsIGRlc2NyICk7CisgICAgTElTVEJPWF9JbnZhbGlkYXRlSXRlbXMoIHduZCwgZGVzY3IsIGluZGV4ICk7CisKKyAgICAvKiBNb3ZlIHNlbGVjdGlvbiBhbmQgZm9jdXNlZCBpdGVtICovCisKKyAgICBpZiAoaW5kZXggPD0gZGVzY3ItPnNlbGVjdGVkX2l0ZW0pIGRlc2NyLT5zZWxlY3RlZF9pdGVtKys7CisgICAgaWYgKGluZGV4IDw9IGRlc2NyLT5mb2N1c19pdGVtKQorICAgIHsKKyAgICAgICAgZGVzY3ItPmZvY3VzX2l0ZW0rKzsKKyAgICAgICAgTElTVEJPWF9Nb3ZlQ2FyZXQoIHduZCwgZGVzY3IsIGRlc2NyLT5mb2N1c19pdGVtIC0gMSwgRkFMU0UgKTsKKyAgICB9CisKKyAgICAvKiBJZiBsaXN0Ym94IHdhcyBlbXB0eSwgc2V0IGZvY3VzIHRvIHRoZSBmaXJzdCBpdGVtICovCisKKyAgICBpZiAoZGVzY3ItPm5iX2l0ZW1zID09IDEpIExJU1RCT1hfU2V0Q2FyZXRJbmRleCggd25kLCBkZXNjciwgMCwgRkFMU0UgKTsKKyAgICByZXR1cm4gTEJfT0tBWTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX0luc2VydFN0cmluZworICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0luc2VydFN0cmluZyggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0ciApCit7CisgICAgTFBTVFIgbmV3X3N0ciA9IE5VTEw7CisgICAgRFdPUkQgZGF0YSA9IDA7CisgICAgTFJFU1VMVCByZXQ7CisKKyAgICBpZiAoSEFTX1NUUklOR1MoZGVzY3IpKQorICAgIHsKKyAgICAgICAgaWYgKCEobmV3X3N0ciA9IEhFQVBfc3RyZHVwQSggZGVzY3ItPmhlYXAsIDAsIHN0ciApKSkKKyAgICAgICAgeworICAgICAgICAgICAgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsIExCTl9FUlJTUEFDRSApOworICAgICAgICAgICAgcmV0dXJuIExCX0VSUlNQQUNFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgZGF0YSA9IChEV09SRClzdHI7CisKKyAgICBpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gZGVzY3ItPm5iX2l0ZW1zOworICAgIGlmICgocmV0ID0gTElTVEJPWF9JbnNlcnRJdGVtKCB3bmQsIGRlc2NyLCBpbmRleCwgbmV3X3N0ciwgZGF0YSApKSAhPSAwKQorICAgIHsKKyAgICAgICAgaWYgKG5ld19zdHIpIEhlYXBGcmVlKCBkZXNjci0+aGVhcCwgMCwgbmV3X3N0ciApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBhZGRlZCBpdGVtICVkICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBpbmRleCwgSEFTX1NUUklOR1MoZGVzY3IpID8gbmV3X3N0ciA6ICIiICk7CisgICAgcmV0dXJuIGluZGV4OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfRGVsZXRlSXRlbQorICoKKyAqIERlbGV0ZSB0aGUgY29udGVudCBvZiBhbiBpdGVtLiAnaW5kZXgnIG11c3QgYmUgYSB2YWxpZCBpbmRleC4KKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9EZWxldGVJdGVtKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLCBJTlQzMiBpbmRleCApCit7CisgICAgLyogTm90ZTogV2luIDMuMSBvbmx5IHNlbmRzIERFTEVURUlURU0gb24gb3duZXItZHJhdyBpdGVtcywKKyAgICAgKiAgICAgICB3aGlsZSBXaW45NSBzZW5kcyBpdCBmb3IgYWxsIGl0ZW1zIHdpdGggdXNlciBkYXRhLgorICAgICAqICAgICAgIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIHNlbmQgaXQgdG9vIG9mdGVuIHRoYW4gbm90CisgICAgICogICAgICAgb2Z0ZW4gZW5vdWdoLCBzbyB0aGlzIGlzIHdoYXQgd2UgZG8gaGVyZS4KKyAgICAgKi8KKyAgICBpZiAoSVNfT1dORVJEUkFXKGRlc2NyKSB8fCBkZXNjci0+aXRlbXNbaW5kZXhdLmRhdGEpCisgICAgeworICAgICAgICBERUxFVEVJVEVNU1RSVUNUMzIgZGlzOworICAgICAgICBkaXMuQ3RsVHlwZSAgPSBPRFRfTElTVEJPWDsKKyAgICAgICAgZGlzLkN0bElEICAgID0gd25kLT53SURtZW51OworICAgICAgICBkaXMuaXRlbUlEICAgPSBpbmRleDsKKyAgICAgICAgZGlzLmh3bmRJdGVtID0gd25kLT5od25kU2VsZjsKKyAgICAgICAgZGlzLml0ZW1EYXRhID0gZGVzY3ItPml0ZW1zW2luZGV4XS5kYXRhOworICAgICAgICBTZW5kTWVzc2FnZTMyQSggd25kLT5od25kU2VsZiwgV01fREVMRVRFSVRFTSwgd25kLT53SURtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkmZGlzICk7CisgICAgfQorICAgIGlmIChIQVNfU1RSSU5HUyhkZXNjcikgJiYgZGVzY3ItPml0ZW1zW2luZGV4XS5zdHIpCisgICAgICAgIEhlYXBGcmVlKCBkZXNjci0+aGVhcCwgMCwgZGVzY3ItPml0ZW1zW2luZGV4XS5zdHIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1JlbW92ZUl0ZW0KKyAqCisgKiBSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBsaXN0Ym94IGFuZCBkZWxldGUgaXRzIGNvbnRlbnQuCisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfUmVtb3ZlSXRlbSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgSU5UMzIgaW5kZXggKQoreworICAgIExCX0lURU1EQVRBICppdGVtOworICAgIElOVDMyIG1heF9pdGVtczsKKworICAgIGlmIChpbmRleCA9PSAtMSkgaW5kZXggPSBkZXNjci0+bmJfaXRlbXMgLSAxOworICAgIGVsc2UgaWYgKChpbmRleCA8IDApIHx8IChpbmRleCA+PSBkZXNjci0+bmJfaXRlbXMpKSByZXR1cm4gTEJfRVJSOworICAgIExJU1RCT1hfRGVsZXRlSXRlbSggd25kLCBkZXNjciwgaW5kZXggKTsKKworICAgIC8qIFJlbW92ZSB0aGUgaXRlbSAqLworCisgICAgaXRlbSA9ICZkZXNjci0+aXRlbXNbaW5kZXhdOworICAgIGlmIChpbmRleCA8IGRlc2NyLT5uYl9pdGVtcy0xKQorICAgICAgICBSdGxNb3ZlTWVtb3J5KCBpdGVtLCBpdGVtICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyLT5uYl9pdGVtcyAtIGluZGV4IC0gMSkgKiBzaXplb2YoTEJfSVRFTURBVEEpICk7CisgICAgZGVzY3ItPm5iX2l0ZW1zLS07CisgICAgaWYgKGRlc2NyLT5hbmNob3JfaXRlbSA9PSBkZXNjci0+bmJfaXRlbXMpIGRlc2NyLT5hbmNob3JfaXRlbS0tOworCisgICAgLyogU2hyaW5rIHRoZSBpdGVtIGFycmF5IGlmIHBvc3NpYmxlICovCisKKyAgICBtYXhfaXRlbXMgPSBIZWFwU2l6ZSggZGVzY3ItPmhlYXAsIDAsIGRlc2NyLT5pdGVtcyApIC8gc2l6ZW9mKExCX0lURU1EQVRBKTsKKyAgICBpZiAoZGVzY3ItPm5iX2l0ZW1zIDwgbWF4X2l0ZW1zIC0gMipMQl9BUlJBWV9HUkFOVUxBUklUWSkKKyAgICB7CisgICAgICAgIG1heF9pdGVtcyAtPSBMQl9BUlJBWV9HUkFOVUxBUklUWTsKKyAgICAgICAgaXRlbSA9IEhlYXBSZUFsbG9jKCBkZXNjci0+aGVhcCwgMCwgZGVzY3ItPml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9pdGVtcyAqIHNpemVvZihMQl9JVEVNREFUQSkgKTsKKyAgICAgICAgaWYgKGl0ZW0pIGRlc2NyLT5pdGVtcyA9IGl0ZW07CisgICAgfQorCisgICAgLyogUmVwYWludCB0aGUgaXRlbXMgKi8KKworICAgIExJU1RCT1hfVXBkYXRlU2Nyb2xsKCB3bmQsIGRlc2NyICk7CisgICAgTElTVEJPWF9JbnZhbGlkYXRlSXRlbXMoIHduZCwgZGVzY3IsIGluZGV4ICk7CisKKyAgICAvKiBNb3ZlIHNlbGVjdGlvbiBhbmQgZm9jdXNlZCBpdGVtICovCisKKyAgICBpZiAoaW5kZXggPD0gZGVzY3ItPnNlbGVjdGVkX2l0ZW0pIGRlc2NyLT5zZWxlY3RlZF9pdGVtLS07CisgICAgaWYgKGluZGV4IDw9IGRlc2NyLT5mb2N1c19pdGVtKQorICAgIHsKKyAgICAgICAgZGVzY3ItPmZvY3VzX2l0ZW0tLTsKKyAgICAgICAgTElTVEJPWF9Nb3ZlQ2FyZXQoIHduZCwgZGVzY3IsIGRlc2NyLT5mb2N1c19pdGVtICsgMSwgRkFMU0UgKTsKKyAgICB9CisgICAgcmV0dXJuIExCX09LQVk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9SZXNldENvbnRlbnQKKyAqLworc3RhdGljIHZvaWQgTElTVEJPWF9SZXNldENvbnRlbnQoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IgKQoreworICAgIElOVDMyIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX2l0ZW1zOyBpKyspIExJU1RCT1hfRGVsZXRlSXRlbSggd25kLCBkZXNjciwgaSApOworICAgIGlmIChkZXNjci0+aXRlbXMpIEhlYXBGcmVlKCBkZXNjci0+aGVhcCwgMCwgZGVzY3ItPml0ZW1zICk7CisgICAgZGVzY3ItPm5iX2l0ZW1zICAgICAgPSAwOworICAgIGRlc2NyLT50b3BfaXRlbSAgICAgID0gMDsKKyAgICBkZXNjci0+c2VsZWN0ZWRfaXRlbSA9IC0xOworICAgIGRlc2NyLT5mb2N1c19pdGVtICAgID0gMDsKKyAgICBkZXNjci0+YW5jaG9yX2l0ZW0gICA9IC0xOworICAgIGRlc2NyLT5pdGVtcyAgICAgICAgID0gTlVMTDsKKyAgICBMSVNUQk9YX1VwZGF0ZVNjcm9sbCggd25kLCBkZXNjciApOworICAgIEludmFsaWRhdGVSZWN0MzIoIHduZC0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMSVNUQk9YX1NldENvdW50CisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfU2V0Q291bnQoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsIElOVDMyIGNvdW50ICkKK3sKKyAgICBMUkVTVUxUIHJldDsKKworICAgIGlmIChIQVNfU1RSSU5HUyhkZXNjcikpIHJldHVybiBMQl9FUlI7CisgICAgLyogRklYTUU6IHRoaXMgaXMgZmFyIGZyb20gb3B0aW1hbC4uLiAqLworICAgIGlmIChjb3VudCA+IGRlc2NyLT5uYl9pdGVtcykKKyAgICB7CisgICAgICAgIHdoaWxlIChjb3VudCA+IGRlc2NyLT5uYl9pdGVtcykKKyAgICAgICAgICAgIGlmICgocmV0ID0gTElTVEJPWF9JbnNlcnRTdHJpbmcoIHduZCwgZGVzY3IsIC0xLCAwICkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBlbHNlIGlmIChjb3VudCA8IGRlc2NyLT5uYl9pdGVtcykKKyAgICB7CisgICAgICAgIHdoaWxlIChjb3VudCA8IGRlc2NyLT5uYl9pdGVtcykKKyAgICAgICAgICAgIGlmICgocmV0ID0gTElTVEJPWF9SZW1vdmVJdGVtKCB3bmQsIGRlc2NyLCAtMSApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIExCX09LQVk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9EaXJlY3RvcnkKKyAqLworTFJFU1VMVCBMSVNUQk9YX0RpcmVjdG9yeSggV05EICp3bmQsIExCX0RFU0NSICpkZXNjciwgVUlOVDMyIGF0dHJpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBmaWxlc3BlYywgQk9PTDMyIGxvbmdfbmFtZXMgKQoreworICAgIGNoYXIgbWFza1sxM107CisgICAgY29uc3QgY2hhciAqcHRyOwogICAgIGNoYXIgKnBhdGgsICpwOworICAgIGludCBjb3VudCwgc2tpcCwgcG9zOworICAgIExSRVNVTFQgcmV0OworICAgIERPU19ESVJFTlQgZW50cnk7CiAKLSAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdEJveERpcmVjdG9yeTogJyVzJyAlMDR4XG4iLCBmaWxlc3BlYywgYXR0cmliKTsKKyAgICAvKiBGSVhNRTogc2hvdWxkIHVzZSBGaW5kRmlyc3RGaWxlL0ZpbmROZXh0RmlsZSAqLworCiAgICAgaWYgKCFmaWxlc3BlYykgcmV0dXJuIExCX0VSUjsKICAgICBpZiAoIShwdHIgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIGZpbGVzcGVjLCBGQUxTRSApKSkgcmV0dXJuIExCX0VSUjsKLSAgICBwYXRoID0geHN0cmR1cChwdHIpOworICAgIHBhdGggPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIHB0ciApOwogICAgIHAgPSBzdHJyY2hyKCBwYXRoLCAnLycgKTsKICAgICAqcCsrID0gJ1wwJzsKLSAgICBpZiAoIShwdHIgPSBET1NGU19Ub0Rvc0ZDQkZvcm1hdCggcCApKSB8fCAKLSAgICAgICAgISh0ZW1wID0gU0VHUFRSX0FMTE9DKCBzaXplb2YoY2hhcikgKiAxNiApKSApCisgICAgaWYgKCEocHRyID0gRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIHAgKSkpCiAgICAgewotICAgICAgICBmcmVlKCBwYXRoICk7CisgICAgICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBwYXRoICk7CiAgICAgICAgIHJldHVybiBMQl9FUlI7CiAgICAgfQotCiAgICAgc3RyY3B5KCBtYXNrLCBwdHIgKTsKIAotICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMaXN0Qm94RGlyZWN0b3J5OiBwYXRoPSVzIG1hc2s9JXNcbiIsIHBhdGgsIG1hc2spOwotCi0gICAgc2tpcCA9IHJldCA9IDA7CisgICAgc2tpcCA9IDA7CisgICAgcmV0ID0gTEJfT0tBWTsKICAgICBhdHRyaWIgJj0gfkZBX0xBQkVMOwogICAgIHdoaWxlICgoY291bnQgPSBET1NGU19GaW5kTmV4dCggcGF0aCwgbWFzaywgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYiwgc2tpcCwgJmVudHJ5ICkpID4gMCkKICAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzI2MF07CiAgICAgICAgIHNraXAgKz0gY291bnQ7CiAgICAgICAgIGlmIChlbnRyeS5hdHRyICYgRkFfRElSRUNUT1JZKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGF0dHJpYiAmIERETF9ESVJFQ1RPUlkpICYmIHN0cmNtcChlbnRyeS5uYW1lLCAiLiAgICAgICAgICAiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHRlbXAsICJbJXNdIiwgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIGVudHJ5Lm5hbWUgKSApOwotICAgICAgICAgICAgICAgIEFuc2lMb3dlciggdGVtcCApOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCBTRUdQVFJfR0VUKHRlbXApKSkgPT0gTEJfRVJSKSBicmVhazsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGF0dHJpYiAmIERETF9ESVJFQ1RPUlkpIHx8ICFzdHJjbXAoZW50cnkubmFtZSwiLiAgICAgICAgICAiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChsb25nX25hbWVzKSBzcHJpbnRmKCBidWZmZXIsICJbJXNdIiwgZW50cnkudW5peG5hbWUgKTsKKyAgICAgICAgICAgIGVsc2Ugc3ByaW50ZiggYnVmZmVyLCAiWyVzXSIsIERPU0ZTX1RvRG9zRFRBRm9ybWF0KCBlbnRyeS5uYW1lICkgKTsKICAgICAgICAgfQogICAgICAgICBlbHNlICAvKiBub3QgYSBkaXJlY3RvcnkgKi8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYXR0cmliICYgRERMX0VYQ0xVU0lWRSkgfHwKLSAgICAgICAgICAgICAgICAoKGF0dHJpYiAmIChGQV9SRE9OTFl8RkFfSElEREVOfEZBX1NZU1RFTXxGQV9BUkNISVZFKSkgPT0KKyAgICAgICAgICAgIGlmICgoYXR0cmliICYgRERMX0VYQ0xVU0lWRSkgJiYKKyAgICAgICAgICAgICAgICAoKGF0dHJpYiAmIChGQV9SRE9OTFl8RkFfSElEREVOfEZBX1NZU1RFTXxGQV9BUkNISVZFKSkgIT0KICAgICAgICAgICAgICAgICAgKGVudHJ5LmF0dHIgJiAoRkFfUkRPTkxZfEZBX0hJRERFTnxGQV9TWVNURU18RkFfQVJDSElWRSkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoIHRlbXAsIERPU0ZTX1RvRG9zRFRBRm9ybWF0KCBlbnRyeS5uYW1lICkgKTsKLSAgICAgICAgICAgICAgICBBbnNpTG93ZXIoIHRlbXAgKTsKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAobG9uZ19uYW1lcykgc3RyY3B5KCBidWZmZXIsIGVudHJ5LnVuaXhuYW1lICk7CisgICAgICAgICAgICBlbHNlIHN0cmNweSggYnVmZmVyLCBET1NGU19Ub0Rvc0RUQUZvcm1hdCggZW50cnkubmFtZSApICk7CiAgICAgICAgIH0KLQotICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJcdG4gLSAlaSwgZmlsZSAnJXMnXG4iLCBjb3VudCwgdGVtcCk7IAorICAgICAgICBpZiAoIWxvbmdfbmFtZXMpIEFuc2lMb3dlciggYnVmZmVyICk7CisgICAgICAgIHBvcyA9IExJU1RCT1hfRmluZEZpbGVTdHJQb3MoIHduZCwgZGVzY3IsIGJ1ZmZlciApOworICAgICAgICBpZiAoKHJldCA9IExJU1RCT1hfSW5zZXJ0U3RyaW5nKCB3bmQsIGRlc2NyLCBwb3MsIGJ1ZmZlciApKSA8IDApCisgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKGF0dHJpYiAmIERETF9EUklWRVMpCisKKyAgICBpZiAoKHJldCA9PSBMQl9PS0FZKSAmJiAoYXR0cmliICYgRERMX0RSSVZFUykpCiAgICAgewotICAgICAgICBpbnQgeDsKLQlEV09SRCBvbGRzdHlsZSA9IGxwaGwtPmR3U3R5bGU7Ci0JICAgIAotCWxwaGwtPmR3U3R5bGUgJj0gfkxCU19TT1JUOwotICAgICAgICBzdHJjcHkoIHRlbXAsICJbLWEtXSIgKTsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IE1BWF9ET1NfRFJJVkVTOyB4KyssIHRlbXBbMl0rKykKKyAgICAgICAgY2hhciBidWZmZXJbXSA9ICJbLWEtXSI7CisgICAgICAgIGludCBkcml2ZTsKKyAgICAgICAgZm9yIChkcml2ZSA9IDA7IGRyaXZlIDwgTUFYX0RPU19EUklWRVM7IGRyaXZlKyssIGJ1ZmZlclsyXSsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRFJJVkVfSXNWYWxpZCh4KSkKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7CisgICAgICAgICAgICBpZiAoIURSSVZFX0lzVmFsaWQoZHJpdmUpKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gTElTVEJPWF9JbnNlcnRTdHJpbmcoIHduZCwgZGVzY3IsIC0xLCBidWZmZXIgKSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0JbHBobC0+ZHdTdHlsZSA9IG9sZHN0eWxlOwogICAgIH0KIAotICAgIGZyZWUoIHBhdGggKTsKLSAgICBTRUdQVFJfRlJFRSggdGVtcCApOwotCisgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHBhdGggKTsKICAgICByZXR1cm4gcmV0OwogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpbWVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1pbnQgTGlzdEJveEdldEl0ZW1SZWN0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIExQUkVDVDE2IGxwcmVjdCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIExJU1RCT1hfSGFuZGxlVlNjcm9sbAorICovCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0hhbmRsZVZTY3JvbGwoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCx3SW5kZXgpOworICAgIFNDUk9MTElORk8gaW5mbzsKIAotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IExCX0dFVElURU1SRUNUICVpICVwIiwgd0luZGV4LGxwbHMpOwotICBpZiAobHBscyA9PSBOVUxMKQotICB7Ci0gICAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfT1dORVJEUkFXVkFSSUFCTEUpCi0gICAgICByZXR1cm4gTEJfRVJSOwotICAgIGVsc2UgCisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSUNPTFVNTikgcmV0dXJuIDA7CisgICAgc3dpdGNoKExPV09SRCh3UGFyYW0pKQogICAgIHsKLSAgICAgR2V0Q2xpZW50UmVjdDE2KGxwaGwtPmhTZWxmLGxwcmVjdCk7Ci0gICAgIGxwcmVjdC0+Ym90dG9tPWxwaGwtPlN0ZEl0ZW1IZWlnaHQ7Ci0gICAgIGlmIChscHJlY3QtPnJpZ2h0PDApIGxwcmVjdC0+cmlnaHQ9MDsKKyAgICBjYXNlIFNCX0xJTkVVUDoKKyAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+dG9wX2l0ZW0gLSAxLCBUUlVFICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0JfTElORURPV046CisgICAgICAgIExJU1RCT1hfU2V0VG9wSXRlbSggd25kLCBkZXNjciwgZGVzY3ItPnRvcF9pdGVtICsgMSwgVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNCX1BBR0VVUDoKKyAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+dG9wX2l0ZW0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RCT1hfR2V0Q3VycmVudFBhZ2VTaXplKCB3bmQsIGRlc2NyICksIFRSVUUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTQl9QQUdFRE9XTjoKKyAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+dG9wX2l0ZW0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJU1RCT1hfR2V0Q3VycmVudFBhZ2VTaXplKCB3bmQsIGRlc2NyICksIFRSVUUgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTQl9USFVNQlBPU0lUSU9OOgorICAgICAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIEhJV09SRCh3UGFyYW0pLCBUUlVFICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0JfVEhVTUJUUkFDSzoKKyAgICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgIGluZm8uZk1hc2sgPSBTSUZfVFJBQ0tQT1M7CisgICAgICAgIEdldFNjcm9sbEluZm8zMiggd25kLT5od25kU2VsZiwgU0JfVkVSVCwgJmluZm8gKTsKKyAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBpbmZvLm5UcmFja1BvcywgVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNCX1RPUDoKKyAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCAwLCBUUlVFICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0JfQk9UVE9NOgorICAgICAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIGRlc2NyLT5uYl9pdGVtcywgVFJVRSApOworICAgICAgICBicmVhazsKICAgICB9Ci0gIH0KLSAgZWxzZQotICAgKmxwcmVjdCA9IGxwbHMtPml0ZW1SZWN0OwotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCIgPSAlZCwlZCAgJWQsJWRcbiIsIGxwcmVjdC0+bGVmdCxscHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPnJpZ2h0LGxwcmVjdC0+Ym90dG9tKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KQotewotICBMUExJU1RTVFJVQ1QgbHBsczsKLQotICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKSkgewotICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSAoc2hvcnQpaGVpZ2h0OwogICAgIHJldHVybiAwOwotICB9Ci0gIAotICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgd0luZGV4KTsKLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgCi0gIGxwbHMtPm1pcy5pdGVtSGVpZ2h0ID0gaGVpZ2h0OwotICByZXR1cm4gMDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RyaW5nIHNlYXJjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gIAotCi1pbnQgTGlzdEJveEZpbmROZXh0TWF0Y2goTFBIRUFETElTVCBscGhsLCBXT1JEIHdDaGFyKQotewotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgVUlOVAkgICAgICAgY291bnQsZmlyc3Q7Ci0KLSAgaWYgKChjaGFyKXdDaGFyIDwgJyAnKSByZXR1cm4gTEJfRVJSOwotICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHJldHVybiBMQl9FUlI7Ci0KLSAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7Ci0gIAotICBmb3IgKGNvdW50ID0gMDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7Ci0gICAgaWYgKHRvbG93ZXIoKmxwbHMtPml0ZW1UZXh0KSA9PSB0b2xvd2VyKChjaGFyKXdDaGFyKSkgYnJlYWs7Ci0gIH0KLSAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgZmlyc3QgPSBjb3VudDsKLSAgZm9yKDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7Ci0gICAgaWYgKCpscGxzLT5pdGVtVGV4dCAhPSAoY2hhcil3Q2hhcikgCi0gICAgICBicmVhazsKLSAgICBpZiAoKHNob3J0KSBjb3VudCA+IGxwaGwtPkl0ZW1Gb2N1c2VkKQotICAgICAgcmV0dXJuIGNvdW50OwotICB9Ci0gIHJldHVybiBmaXJzdDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJDcmVhdGUKLSAqLwotc3RhdGljIExPTkcgTEJDcmVhdGUoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgICBscGhsOwotICBMT05HCSAgICAgICBkd1N0eWxlID0gR2V0V2luZG93TG9uZzMyQShod25kLEdXTF9TVFlMRSk7Ci0gIFJFQ1QxNiByZWN0OwotCi0gIENyZWF0ZUxpc3RCb3hTdHJ1Y3QoaHduZCwgT0RUX0xJU1RCT1gsIGR3U3R5bGUsIEdldFBhcmVudDE2KGh3bmQpKTsKLSAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IGNyZWF0ZWQ6IGxwaGwgPSAlcCBkd1N0eWxlID0gJTA0eDolMDR4XG4iLCAKLQkJCSAgbHBobCwgSElXT1JEKGR3U3R5bGUpLCBMT1dPUkQoZHdTdHlsZSkpOwotCi0gIEdldENsaWVudFJlY3QxNihod25kLCZyZWN0KTsKLSAgbHBobC0+Q29sdW1uc1dpZHRoID0gcmVjdC5yaWdodCAtIHJlY3QubGVmdDsKLQotICBpZiAoZHdTdHlsZSAmIFdTX1ZTQ1JPTEwpIAotICAgIFNldFNjcm9sbFJhbmdlMzIoaHduZCwgU0JfVkVSVCwgMCwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSwgVFJVRSk7Ci0gIGlmIChkd1N0eWxlICYgV1NfSFNDUk9MTCkgCi0gICAgU2V0U2Nyb2xsUmFuZ2UzMihod25kLCBTQl9IT1JaLCAxLCAxLCBUUlVFKTsKLQotICByZXR1cm4gMDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQkRlc3Ryb3kKKyAqICAgICAgICAgICBMSVNUQk9YX0hhbmRsZUhTY3JvbGwKICAqLwotc3RhdGljIExPTkcgTEJEZXN0cm95KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExSRVNVTFQgTElTVEJPWF9IYW5kbGVIU2Nyb2xsKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKQogewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICBTQ1JPTExJTkZPIGluZm87CisgICAgSU5UMzIgcGFnZTsKIAotICBMaXN0Qm94UmVzZXRDb250ZW50KGxwaGwpOwotCi0gIERlc3Ryb3lMaXN0Qm94U3RydWN0KGxwaGwpOwotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IGRlc3Ryb3llZDogbHBobCA9ICVwXG4iLGxwaGwpOwotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQk5DQ2FsY1NpemUKLSAqLwotc3RhdGljIExPTkcgTEJOQ0NhbGNTaXplKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMT05HCSAgICAgcmV0ID0gRGVmV2luZG93UHJvYzE2KGh3bmQsIFdNX05DQ0FMQ1NJWkUsIHdQYXJhbSwgbFBhcmFtKTsKLQotICByZXR1cm4gKEdldFdpbmRvd0xvbmczMkEoaHduZCxHV0xfU1RZTEUpICYgTEJTX01VTFRJQ09MVU1OKT8gV1ZSX1ZSRURSQVcgOiByZXQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJWU2Nyb2xsCi0gKi8KLXN0YXRpYyBMT05HIExCVlNjcm9sbChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGludCAgeTsKLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX1ZTQ1JPTEwgdz0lMDRYIGw9JTA4bFggIVxuIiwKLQkJICB3UGFyYW0sIGxQYXJhbSk7Ci0gIHkgPSBscGhsLT5GaXJzdFZpc2libGU7Ci0KLSAgc3dpdGNoKHdQYXJhbSkgewotICBjYXNlIFNCX0xJTkVVUDoKLSAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMCkKLSAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZS0tOwotICAgIGJyZWFrOwotCi0gIGNhc2UgU0JfTElORURPV046Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlKys7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBTQl9QQUdFVVA6Ci0gICAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IGxwaGwtPkl0ZW1zVmlzaWJsZSkgewotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKLSAgICB9IGVsc2UgewotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gMDsKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgIHsKKyAgICAgICAgc3dpdGNoKExPV09SRCh3UGFyYW0pKQorICAgICAgICB7CisgICAgICAgIGNhc2UgU0JfTElORUxFRlQ6CisgICAgICAgICAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIGRlc2NyLT50b3BfaXRlbS1kZXNjci0+cGFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9MSU5FUklHSFQ6CisgICAgICAgICAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIGRlc2NyLT50b3BfaXRlbStkZXNjci0+cGFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9QQUdFTEVGVDoKKyAgICAgICAgICAgIHBhZ2UgPSBkZXNjci0+d2lkdGggLyBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgICAgICAgICAgaWYgKHBhZ2UgPCAxKSBwYWdlID0gMTsKKyAgICAgICAgICAgIExJU1RCT1hfU2V0VG9wSXRlbSggd25kLCBkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPnRvcF9pdGVtIC0gcGFnZSAqIGRlc2NyLT5wYWdlX3NpemUsIFRSVUUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCX1BBR0VSSUdIVDoKKyAgICAgICAgICAgIHBhZ2UgPSBkZXNjci0+d2lkdGggLyBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgICAgICAgICAgaWYgKHBhZ2UgPCAxKSBwYWdlID0gMTsKKyAgICAgICAgICAgIExJU1RCT1hfU2V0VG9wSXRlbSggd25kLCBkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPnRvcF9pdGVtICsgcGFnZSAqIGRlc2NyLT5wYWdlX3NpemUsIFRSVUUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCX1RIVU1CUE9TSVRJT046CisgICAgICAgICAgICBMSVNUQk9YX1NldFRvcEl0ZW0oIHduZCwgZGVzY3IsIEhJV09SRCh3UGFyYW0pKmRlc2NyLT5wYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCX1RIVU1CVFJBQ0s6CisgICAgICAgICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGluZm8uZk1hc2sgID0gU0lGX1RSQUNLUE9TOworICAgICAgICAgICAgR2V0U2Nyb2xsSW5mbzMyKCB3bmQtPmh3bmRTZWxmLCBTQl9WRVJULCAmaW5mbyApOworICAgICAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCBpbmZvLm5UcmFja1BvcypkZXNjci0+cGFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9MRUZUOgorICAgICAgICAgICAgTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCAwLCBUUlVFICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9SSUdIVDoKKyAgICAgICAgICAgIExJU1RCT1hfU2V0VG9wSXRlbSggd25kLCBkZXNjciwgZGVzY3ItPm5iX2l0ZW1zLCBUUlVFICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIFNCX1BBR0VET1dOOgotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSArPSBscGhsLT5JdGVtc1Zpc2libGU7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBTQl9USFVNQlRSQUNLOgotICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IExPV09SRChsUGFyYW0pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGxwaGwtPkZpcnN0VmlzaWJsZSA+IExpc3RNYXhGaXJzdFZpc2libGUobHBobCkpCi0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKTsKLQotICBpZiAoeSAhPSBscGhsLT5GaXJzdFZpc2libGUpIHsKLSAgICBTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgfQotICByZXR1cm4gMDsKKyAgICBlbHNlIGlmIChkZXNjci0+aG9yel9leHRlbnQpCisgICAgeworICAgICAgICBzd2l0Y2goTE9XT1JEKHdQYXJhbSkpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBTQl9MSU5FTEVGVDoKKyAgICAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwgZGVzY3ItPmhvcnpfcG9zIC0gMSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0JfTElORVJJR0hUOgorICAgICAgICAgICAgTElTVEJPWF9TZXRIb3Jpem9udGFsUG9zKCB3bmQsIGRlc2NyLCBkZXNjci0+aG9yel9wb3MgKyAxICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9QQUdFTEVGVDoKKyAgICAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmhvcnpfcG9zIC0gZGVzY3ItPndpZHRoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9QQUdFUklHSFQ6CisgICAgICAgICAgICBMSVNUQk9YX1NldEhvcml6b250YWxQb3MoIHduZCwgZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5ob3J6X3BvcyArIGRlc2NyLT53aWR0aCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0JfVEhVTUJQT1NJVElPTjoKKyAgICAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwgSElXT1JEKHdQYXJhbSkgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNCX1RIVU1CVFJBQ0s6CisgICAgICAgICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGluZm8uZk1hc2sgPSBTSUZfVFJBQ0tQT1M7CisgICAgICAgICAgICBHZXRTY3JvbGxJbmZvMzIoIHduZC0+aHduZFNlbGYsIFNCX0hPUlosICZpbmZvICk7CisgICAgICAgICAgICBMSVNUQk9YX1NldEhvcml6b250YWxQb3MoIHduZCwgZGVzY3IsIGluZm8ublRyYWNrUG9zICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9MRUZUOgorICAgICAgICAgICAgTElTVEJPWF9TZXRIb3Jpem9udGFsUG9zKCB3bmQsIGRlc2NyLCAwICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTQl9SSUdIVDoKKyAgICAgICAgICAgIExJU1RCT1hfU2V0SG9yaXpvbnRhbFBvcyggd25kLCBkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmhvcnpfZXh0ZW50IC0gZGVzY3ItPndpZHRoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQkhTY3JvbGwKKyAqICAgICAgICAgICBMSVNUQk9YX0hhbmRsZUxCdXR0b25Eb3duCiAgKi8KLXN0YXRpYyBMT05HIExCSFNjcm9sbChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfSGFuZGxlTEJ1dHRvbkRvd24oIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0sIElOVDMyIHgsIElOVDMyIHkgKQogewotICBMUEhFQURMSVNUIGxwaGw7Ci0gIGludCAgICAgICAgeTsKLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94IFdNX0hTQ1JPTEwgdz0lMDRYIGw9JTA4bFggIVxuIiwKLQkJICB3UGFyYW0sIGxQYXJhbSk7Ci0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgeSA9IGxwaGwtPkZpcnN0VmlzaWJsZTsKLSAgc3dpdGNoKHdQYXJhbSkgewotICBjYXNlIFNCX0xJTkVVUDoKLSAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gbHBobC0+SXRlbXNQZXJDb2x1bW4pIHsKLSAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSAtPSBscGhsLT5JdGVtc1BlckNvbHVtbjsKLSAgICB9IGVsc2UgewotICAgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gMDsKKyAgICBJTlQzMiBpbmRleCA9IExJU1RCT1hfR2V0SXRlbUZyb21Qb2ludCggd25kLCBkZXNjciwgeCwgeSApOworICAgIGRwcmludGZfbGlzdGJveCggc3RkZGViLCAiTGlzdGJveCAlMDR4OiBsYnV0dG9uZG93biAlZCwlZCBpdGVtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiwgeCwgeSwgaW5kZXggKTsKKyAgICBpZiAoIWRlc2NyLT5jYXJldF9vbiAmJiAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKSByZXR1cm4gMDsKKyAgICBpZiAoaW5kZXggIT0gLTEpCisgICAgeworICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX0VYVEVOREVEU0VMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoISh3UGFyYW0gJiBNS19TSElGVCkpIGRlc2NyLT5hbmNob3JfaXRlbSA9IGluZGV4OworICAgICAgICAgICAgaWYgKHdQYXJhbSAmIE1LX0NPTlRST0wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTElTVEJPWF9TZXRDYXJldEluZGV4KCB3bmQsIGRlc2NyLCBpbmRleCwgRkFMU0UgKTsKKyAgICAgICAgICAgICAgICBMSVNUQk9YX1NldFNlbGVjdGlvbiggd25kLCBkZXNjciwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZXNjci0+aXRlbXNbaW5kZXhdLnNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkgIT0gMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBMSVNUQk9YX01vdmVDYXJldCggd25kLCBkZXNjciwgaW5kZXgsIEZBTFNFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMSVNUQk9YX01vdmVDYXJldCggd25kLCBkZXNjciwgaW5kZXgsIEZBTFNFICk7CisgICAgICAgICAgICBMSVNUQk9YX1NldFNlbGVjdGlvbiggd25kLCBkZXNjciwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWRlc2NyLT5pdGVtc1tpbmRleF0uc2VsZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKSAhPSAwICk7CisgICAgICAgIH0KICAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JfTElORURPV046Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlICs9IGxwaGwtPkl0ZW1zUGVyQ29sdW1uOwotICAgIGJyZWFrOwotICBjYXNlIFNCX1BBR0VVUDoKLSAgICBpZiAobHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkgewotICAgICAgaW50IGxic3ViID0gbHBobC0+SXRlbXNWaXNpYmxlIC8gbHBobC0+SXRlbXNQZXJDb2x1bW4gKiBscGhsLT5JdGVtc1BlckNvbHVtbjsKLSAgICAgIGlmIChscGhsLT5GaXJzdFZpc2libGUgPiBsYnN1YikgewotCWxwaGwtPkZpcnN0VmlzaWJsZSAtPSBsYnN1YjsKLSAgICAgIH0gZWxzZSB7Ci0JbHBobC0+Rmlyc3RWaXNpYmxlID0gMDsKLSAgICAgIH0KKyAgICBTZXRGb2N1czMyKCB3bmQtPmh3bmRTZWxmICk7CisgICAgU2V0Q2FwdHVyZTMyKCB3bmQtPmh3bmRTZWxmICk7CisgICAgaWYgKGluZGV4ICE9IC0xKQorICAgIHsKKyAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19OT1RJRlkpCisgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9MQlRSQUNLUE9JTlQsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VMUEFSQU0oIHgsIHkgKSApOworICAgICAgICBpZiAod25kLT5kd0V4U3R5bGUgJiBXU19FWF9EUkFHREVURUNUKQorICAgICAgICB7CisgICAgICAgICAgICBQT0lOVDE2IHB0ID0geyB4LCB5IH07CisgICAgICAgICAgICBpZiAoRHJhZ0RldGVjdCggd25kLT5od25kU2VsZiwgcHQgKSkKKyAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9CRUdJTkRSQUcsIDAsIDAgKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBTQl9QQUdFRE9XTjoKLSAgICBpZiAobHBobC0+SXRlbXNQZXJDb2x1bW4gIT0gMCkKLSAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSArPSBscGhsLT5JdGVtc1Zpc2libGUgLwotCWxwaGwtPkl0ZW1zUGVyQ29sdW1uICogbHBobC0+SXRlbXNQZXJDb2x1bW47Ci0gICAgYnJlYWs7Ci0gIGNhc2UgU0JfVEhVTUJUUkFDSzoKLSAgICBscGhsLT5GaXJzdFZpc2libGUgPSBscGhsLT5JdGVtc1BlckNvbHVtbiAqIExPV09SRChsUGFyYW0pOwotICAgIGJyZWFrOwotICB9IAotICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSkKLSAgICBscGhsLT5GaXJzdFZpc2libGUgPSBMaXN0TWF4Rmlyc3RWaXNpYmxlKGxwaGwpOwotCi0gIGlmIChscGhsLT5JdGVtc1BlckNvbHVtbiAhPSAwKSB7Ci0gICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+Rmlyc3RWaXNpYmxlIC8KLSAgICAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uICogbHBobC0+SXRlbXNQZXJDb2x1bW4gKyAxOwotICAgIGlmICh5ICE9IGxwaGwtPkZpcnN0VmlzaWJsZSkgewotICAgICAgU2V0U2Nyb2xsUG9zMzIoaHduZCwgU0JfSE9SWiwgbHBobC0+Rmlyc3RWaXNpYmxlIC8gCi0JCSAgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uICsgMSwgVFJVRSk7Ci0gICAgICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQkxCdXR0b25Eb3duCi0gKi8KLXN0YXRpYyBMT05HIExCTEJ1dHRvbkRvd24oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBXT1JEICAgICAgIHdSZXQ7Ci0gIGludCAgICAgICAgeSxuOwotICBSRUNUMTYgICAgIHJlY3RzZWw7Ci0KLSAgU2V0Rm9jdXMzMihod25kKTsKLSAgU2V0Q2FwdHVyZTMyKGh3bmQpOwotCi0gIGxwaGwtPlByZXZGb2N1c2VkID0gbHBobC0+SXRlbUZvY3VzZWQ7Ci0KLSAgeSA9IExpc3RCb3hGaW5kTW91c2UobHBobCwgTE9XT1JEKGxQYXJhbSksIEhJV09SRChsUGFyYW0pKTsKLQotICBpZiAoeSA9PSAtMSkgcmV0dXJuIDA7Ci0KLSAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTk9USUZZICYmIHkhPSBMQl9FUlIgKQotICAgICBpZiggU2VuZE1lc3NhZ2UxNihscGhsLT5oUGFyZW50LCBXTV9MQlRSQUNLUE9JTlQsIHksIGxQYXJhbSkgKQotICAgICAgICAgcmV0dXJuIDA7Ci0KLQotICBzd2l0Y2goIGxwaGwtPmR3U3R5bGUgJiAoTEJTX01VTFRJUExFU0VMIHwgTEJTX0VYVEVOREVEU0VMKSApCi0gICB7Ci0gICAgICAgIGNhc2UgTEJTX01VTFRJUExFU0VMOgotICAgICAgICAgICAgICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0geTsKLSAgICAgICAgICAgICAgICB3UmV0ID0gTGlzdEJveEdldFNlbChscGhsLCB5KTsKLSAgICAgICAgICAgICAgICBMaXN0Qm94U2V0U2VsKGxwaGwsIHksICF3UmV0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMQlNfRVhURU5ERURTRUw6Ci0gICAgICAgICAgICAgICAgLyogc2hvdWxkIGhhbmRsZSBleHRlbmRlZCBtb2RlIGhlcmUgYW5kIGluIGtiZCBoYW5kbGVyIAotICAgICAgICAgICAgICAgICAqLyAKLQotICAgICAgICAgICAgICAgIGlmICggbHBobC0+UHJldkZvY3VzZWQgIT0geSAmJiB5IT0gTEJfRVJSKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbSggbHBobCwgbHBobC0+SXRlbUZvY3VzZWQgPSB5ICk7Ci0gICAgICAgICAgICAgICAgICAgbiA9IExpc3RCb3hTZXRTZWwobHBobCwtMSxGQUxTRSk7Ci0KLSAgICAgICAgICAgICAgICAgICBscGxzLT5pdGVtU3RhdGUgPSBPRFNfRk9DVVMgfCBPRFNfU0VMRUNURUQ7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiggbiA+IDEgJiYgbiAhPSBMQl9FUlIgKQotICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCxOVUxMLFRSVUUgKTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmKCB5IT1scGhsLT5JdGVtRm9jdXNlZCApCi0gICAgICAgICAgICAgICAgICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIHkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkbmltcCwiTGlzdGJveDogTEJTX01VTFRJUExFU0VMIGFuZCBMQlNfRVhURU5ERURTRUwgYXJlIG9uIVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAvKiBpbnZhbGlkYXRlIGNoYW5nZWQgaXRlbXMgKi8KLSBpZiggbHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCB8fCB5IT1scGhsLT5QcmV2Rm9jdXNlZCApCi0gICB7Ci0gICAgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCB5LCAmcmVjdHNlbCk7Ci0gICAgIEludmFsaWRhdGVSZWN0MTYoIGh3bmQsICZyZWN0c2VsLCBUUlVFICk7Ci0gICB9Ci0gaWYoIGxwaGwtPlByZXZGb2N1c2VkIT0tMSAmJiB5IT1scGhsLT5QcmV2Rm9jdXNlZCApIAotICAgewotICAgICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgbHBobC0+UHJldkZvY3VzZWQsICZyZWN0c2VsKTsKLSAgICAgSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3RzZWwsIFRSVUUgKTsKLSAgIH0KLQotICBpZiAoR2V0V2luZG93TG9uZzMyQShscGhsLT5oU2VsZixHV0xfRVhTVFlMRSkgJiBXU19FWF9EUkFHREVURUNUKQotICAgICBpZiggRHJhZ0RldGVjdChscGhsLT5oU2VsZixNQUtFUE9JTlQxNihsUGFyYW0pKSApCi0gICAgICAgICBTZW5kTWVzc2FnZTE2KGxwaGwtPmhQYXJlbnQsIFdNX0JFR0lORFJBRywwLDBMKTsKLSAgcmV0dXJuIDA7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCTEJ1dHRvblVwCi0gKi8KLXN0YXRpYyBMT05HIExCTEJ1dHRvblVwKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotICBpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gaHduZCkgUmVsZWFzZUNhcHR1cmUoKTsKLQotICBpZiAobHBobC0+UHJldkZvY3VzZWQgIT0gbHBobC0+SXRlbUZvY3VzZWQpCi0gICAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgTEJOX1NFTENIQU5HRSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCUkJ1dHRvblVwCi0gKi8KLXN0YXRpYyBMT05HIExCUkJ1dHRvblVwKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotICBTZW5kTWVzc2FnZTE2KGxwaGwtPmhQYXJlbnQsIFdNX0NPTU1BTkQsIEdldFdpbmRvd1dvcmQoaHduZCxHV1dfSUQpLAotCQlNQUtFTE9ORyhod25kLCBMQk5fREJMQ0xLKSk7Ci0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQk1vdXNlTW92ZQotICovCi1zdGF0aWMgTE9ORyBMQk1vdXNlTW92ZShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGludCAgeSxyZWRyYXdfcHJldiA9IDA7Ci0gIGludCAgaVJldDsKLSAgUkVDVDE2IHJlY3QsIHJlY3RzZWw7ICAgLyogWFhYIEJyb2tlbiAqLwotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCTW91c2VNb3ZlICVkICVkXG4iLFNMT1dPUkQobFBhcmFtKSxTSElXT1JEKGxQYXJhbSkpOwotICBpZiAoKHdQYXJhbSAmIE1LX0xCVVRUT04pICE9IDApIHsKLSAgICB5ID0gU0hJV09SRChsUGFyYW0pOwotICAgIGlmICh5IDwgTEJNTV9FREdFKSB7Ci0gICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gMCkgewotCWxwaGwtPkZpcnN0VmlzaWJsZS0tOwotCVNldFNjcm9sbFBvczMyKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0JSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotCXJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOwotICAgIGlmICh5ID49IChyZWN0LmJvdHRvbS1MQk1NX0VER0UpKSB7Ci0gICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlIDwgTGlzdE1heEZpcnN0VmlzaWJsZShscGhsKSkgewotCWxwaGwtPkZpcnN0VmlzaWJsZSsrOwotCVNldFNjcm9sbFBvczMyKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0JSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotCXJldHVybiAwOwotICAgICAgfQotICAgICAgfQotICAgIGlmICgoeSA+IDApICYmICh5IDwgKHJlY3QuYm90dG9tIC0gTEJNTV9FREdFKSkpIHsKLSAgICAgIGlmICgoeSA8IHJlY3RzZWwudG9wKSB8fCAoeSA+IHJlY3RzZWwuYm90dG9tKSkgewotICAgICAgICBpUmV0ID0gTGlzdEJveEZpbmRNb3VzZShscGhsLCBMT1dPUkQobFBhcmFtKSwgSElXT1JEKGxQYXJhbSkpOwotICAgICAgICBpZiAoaVJldCA9PSBscGhsLT5JdGVtRm9jdXNlZCB8fCBpUmV0ID09IC0xKSAgewotCSAgcmV0dXJuIDA7Ci0JfQotCWlmIChscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSB7Ci0gICAgICAgICAgbHBobC0+SXRlbUZvY3VzZWQgPSBpUmV0OwotCSAgTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgTEJOX1NFTENIQU5HRSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIGxwaGwtPmR3U3R5bGUgJiBMQlNfRVhURU5ERURTRUwgKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgLyogRml4bWU6IGV4dGVuZGVkIHNlbGVjdGlvbiBtb2RlICovCi0gICAgICAgICAgICAgICAgICAgICBMaXN0Qm94U2V0U2VsKCBscGhsLCBscGhsLT5JdGVtRm9jdXNlZCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotICAgICAgICAgICAgICAgICAgICAgbHBobC0+SXRlbUZvY3VzZWQgPSBpUmV0OwotICAgICAgICAgICAgICAgICAgICAgTGlzdEJveFNldFNlbCggbHBobCwgaVJldCwgVFJVRSk7Ci0gICAgICAgICAgICAgICAgICAgICByZWRyYXdfcHJldiA9IDE7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIChXT1JEKWlSZXQpOwotICAgICAgICAgICAgICAgICAgICAgcmVkcmF3X3ByZXYgPSAxOyAKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgaWYoIGxwaGwtPlByZXZGb2N1c2VkIT0tMSAmJiByZWRyYXdfcHJldiApCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIGxwaGwtPlByZXZGb2N1c2VkLCAmcmVjdHNlbCk7Ci0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdHNlbCwgVFJVRSApOwotICAgICAgICAgIH0KLSAgICAgICAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsIGlSZXQsICZyZWN0c2VsKTsKLQlJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdHNlbCwgVFJVRSApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotICB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCS2V5RG93bgorICogICAgICAgICAgIExJU1RCT1hfSGFuZGxlVGltZXIKICAqCi0gKiBEb2Vzbid0IHlldCBoYW5kbGUgcHJvcGVybHkgVktfU0hJRlQgd2l0aCBMQl9FWFRFTkRFRFNFTAorICogSGFuZGxlIHNjcm9sbGluZyB1cG9uIGEgdGltZXIgZXZlbnQuCisgKiBSZXR1cm4gVFJVRSBpZiBzY3JvbGxpbmcgc2hvdWxkIGNvbnRpbnVlLgogICovCi1zdGF0aWMgTE9ORyBMQktleURvd24oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0hhbmRsZVRpbWVyKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaW5kZXgsIFRJTUVSX0RJUkVDVElPTiBkaXIgKQogewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgV09SRCAgICAgICBuZXdGb2N1c2VkID0gMHhGRkZGOwotICBSRUNUMTYgICAgIHJlY3Q7Ci0KLSAgTGlzdEJveEdldEl0ZW1SZWN0KGxwaGwsbHBobC0+SXRlbUZvY3VzZWQsJnJlY3QpOwotICBzd2l0Y2god1BhcmFtKSAKKyAgICBzd2l0Y2goZGlyKQogICAgIHsKLQljYXNlIFZLX0hPTUU6Ci0JY2FzZSBWS19FTkQ6Ci0JY2FzZSBWS19MRUZUOgotCWNhc2UgVktfUklHSFQ6Ci0JY2FzZSBWS19VUDoKLQljYXNlIFZLX0RPV046Ci0JY2FzZSBWS19QUklPUjoKLQljYXNlIFZLX05FWFQ6Ci0JICAgICBpZiAoIGxwaGwtPmR3U3R5bGUgJiBMQlNfV0FOVEtFWUJPQVJESU5QVVQgKQotCSAgICAgICAgewotCQkgIG5ld0ZvY3VzZWQgPSAoV09SRCkoSU5UKVNlbmRNZXNzYWdlMTYobHBobC0+aFBhcmVudCxXTV9WS0VZVE9JVEVNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3UGFyYW0sTUFLRUxQQVJBTShscGhsLT5JdGVtRm9jdXNlZCxod25kKSk7Ci0JICAgICAgICAgIGlmICggbmV3Rm9jdXNlZCA9PSAweEZGRkUgKSByZXR1cm4gMEw7Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgaWYgKCBuZXdGb2N1c2VkID09IDB4RkZGRiApIAotCQl7Ci0JCSAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOwotCi0JCSAgLyogbmVzdGVkIHN3aXRjaCAqLwotCQkgIHN3aXRjaCh3UGFyYW0pCi0JCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0hPTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfRU5EOgotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkID0gbHBobC0+SXRlbXNDb3VudCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MRUZUOgotICAJCQkgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJQ09MVU1OKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWQgPj0gbHBobC0+SXRlbXNQZXJDb2x1bW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZCAtPSBscGhsLT5JdGVtc1BlckNvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1VQOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Rm9jdXNlZCA+IDApIG5ld0ZvY3VzZWQtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JJR0hUOgotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSUNPTFVNTikgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZvY3VzZWQgKz0gbHBobC0+SXRlbXNQZXJDb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19ET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19QUklPUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZvY3VzZWQgPiBscGhsLT5JdGVtc1Zpc2libGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkIC09IGxwaGwtPkl0ZW1zVmlzaWJsZTsKLQkJCSAgICBlbHNlICBuZXdGb2N1c2VkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTkVYVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZCArPSBscGhsLT5JdGVtc1Zpc2libGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQkJICAvKiBlbmQgb2YgbmVzdGVkIHN3aXRjaCAqLwotCQl9Ci0JICAgICBicmVhazsgICAKLQljYXNlIFZLX1NQQUNFOgotICAgICAgICAgICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgV09SRCB3UmV0ID0gTGlzdEJveEdldFNlbChscGhsLCBscGhsLT5JdGVtRm9jdXNlZCk7Ci0gICAgICAgICAgICAgICAgIExpc3RCb3hTZXRTZWwobHBobCwgbHBobC0+SXRlbUZvY3VzZWQsICF3UmV0KTsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIC8qIGNoYXJzIGFyZSBoYW5kbGVkIGluIExCQ2hhciAqLwotCWRlZmF1bHQ6Ci0JICAgICByZXR1cm4gMDsKKyAgICBjYXNlIExCX1RJTUVSX1VQOgorICAgICAgICBpZiAoZGVzY3ItPnRvcF9pdGVtKSBpbmRleCA9IGRlc2NyLT50b3BfaXRlbSAtIDE7CisgICAgICAgIGVsc2UgaW5kZXggPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExCX1RJTUVSX0xFRlQ6CisgICAgICAgIGlmIChkZXNjci0+dG9wX2l0ZW0pIGluZGV4IC09IGRlc2NyLT5wYWdlX3NpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEJfVElNRVJfRE9XTjoKKyAgICAgICAgaW5kZXggPSBkZXNjci0+dG9wX2l0ZW0gKyBMSVNUQk9YX0dldEN1cnJlbnRQYWdlU2l6ZSggd25kLCBkZXNjciApOworICAgICAgICBpZiAoaW5kZXggPj0gZGVzY3ItPm5iX2l0ZW1zKSBpbmRleCA9IGRlc2NyLT5uYl9pdGVtcyAtIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEJfVElNRVJfUklHSFQ6CisgICAgICAgIGlmIChpbmRleCArIGRlc2NyLT5wYWdlX3NpemUgPCBkZXNjci0+bmJfaXRlbXMpCisgICAgICAgICAgICBpbmRleCArPSBkZXNjci0+cGFnZV9zaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExCX1RJTUVSX05PTkU6CisgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBpZiAoaW5kZXggPT0gZGVzY3ItPmZvY3VzX2l0ZW0pIHJldHVybiBGQUxTRTsKKyAgICBMSVNUQk9YX01vdmVDYXJldCggd25kLCBkZXNjciwgaW5kZXgsIEZBTFNFICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CiAKLSAgLyogYXQgdGhpcyBwb2ludCBuZXdGb2N1c2VkIGlzIHNldCB1cCAqLwogCi0gIGlmIChuZXdGb2N1c2VkID49IGxwaGwtPkl0ZW1zQ291bnQpCi0gICAgbmV3Rm9jdXNlZCA9IGxwaGwtPkl0ZW1zQ291bnQgLSAxOwotICAKLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkpIAotICAgICB7Ci0gICAgICAgIExpc3RCb3hTZXRDdXJTZWwobHBobCwgbmV3Rm9jdXNlZCk7Ci0JTGlzdEJveFNlbmROb3RpZmljYXRpb24obHBobCwgTEJOX1NFTENIQU5HRSk7Ci0gICAgIH0KLQotICBscGhsLT5JdGVtRm9jdXNlZCA9IG5ld0ZvY3VzZWQ7Ci0KLSAgaWYoIExpc3RCb3hTY3JvbGxUb0ZvY3VzKGxwaGwpIHx8IChscGhsLT5kd1N0eWxlICYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpKSApCi0gIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgZWxzZQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTElTVEJPWF9IYW5kbGVTeXN0ZW1UaW1lcgorICoKKyAqIFdNX1NZU1RJTUVSIGhhbmRsZXIuCisgKi8KK3N0YXRpYyBMUkVTVUxUIExJU1RCT1hfSGFuZGxlU3lzdGVtVGltZXIoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IgKQoreworICAgIGlmICghTElTVEJPWF9IYW5kbGVUaW1lciggd25kLCBkZXNjciwgZGVzY3ItPmZvY3VzX2l0ZW0sIExJU1RCT1hfVGltZXIgKSkKICAgICB7Ci0JSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3QsIFRSVUUgKTsKLQlpZiggbmV3Rm9jdXNlZCA8IDB4ODAwMCApCi0gICAgICAgICAgewotCSAgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLCBuZXdGb2N1c2VkLCAmcmVjdCk7Ci0JICAgSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3QsIFRSVUUgKTsKLSAgICAgICAgICB9CisgICAgICAgIEtpbGxTeXN0ZW1UaW1lcjMyKCB3bmQtPmh3bmRTZWxmLCBMQl9USU1FUl9JRCApOworICAgICAgICBMSVNUQk9YX1RpbWVyID0gTEJfVElNRVJfTk9ORTsKICAgICB9Ci0KLSAgU2V0U2Nyb2xsUG9zMzIoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJDaGFyCi0gKi8KLXN0YXRpYyBMT05HIExCQ2hhcihIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIFdPUkQgICAgICAgbmV3Rm9jdXNlZCA9IDB4RkZGRjsKLQotICBpZiAoIChscGhsLT5kd1N0eWxlICYgTEJTX1dBTlRLRVlCT0FSRElOUFVUKSAmJiAhKGxwaGwtPkhhc1N0cmluZ3MpKQotICAgICAgIHsKLSAgICAgICAgbmV3Rm9jdXNlZCA9IChXT1JEKShJTlQpU2VuZE1lc3NhZ2UxNihscGhsLT5oUGFyZW50LFdNX0NIQVJUT0lURU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1BhcmFtLE1BS0VMUEFSQU0obHBobC0+SXRlbUZvY3VzZWQsaHduZCkpOwotICAgICAgICBpZiAoIG5ld0ZvY3VzZWQgPT0gMHhGRkZFICkgcmV0dXJuIDBMOwotICAgICAgIH0KLQotICBpZiAobmV3Rm9jdXNlZCA9PSAweEZGRkYgKSAKLSAgbmV3Rm9jdXNlZCA9IExpc3RCb3hGaW5kTmV4dE1hdGNoKGxwaGwsIHdQYXJhbSk7Ci0KLSAgaWYgKG5ld0ZvY3VzZWQgPT0gKFdPUkQpTEJfRVJSKSByZXR1cm4gMDsKLQotICBpZiAobmV3Rm9jdXNlZCA+PSBscGhsLT5JdGVtc0NvdW50KQotICAgIG5ld0ZvY3VzZWQgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKLQotICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX01VTFRJUExFU0VMKSkgCi0gICAgIHsKLSAgICBMaXN0Qm94U2V0Q3VyU2VsKGxwaGwsIG5ld0ZvY3VzZWQpOwotCUxpc3RCb3hTZW5kTm90aWZpY2F0aW9uKGxwaGwsIExCTl9TRUxDSEFOR0UpOwotICB9Ci0KLSAgbHBobC0+SXRlbUZvY3VzZWQgPSBuZXdGb2N1c2VkOwotICBMaXN0Qm94U2Nyb2xsVG9Gb2N1cyhscGhsKTsKLSAgU2V0U2Nyb2xsUG9zMzIoaHduZCwgU0JfVkVSVCwgbHBobC0+Rmlyc3RWaXNpYmxlLCBUUlVFKTsKLQotICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCU2V0UmVkcmF3Ci0gKi8KLXN0YXRpYyBMT05HIExCU2V0UmVkcmF3KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBXTV9TRVRSRURSQVcgaFduZD0lMDR4IHc9JTA0eCAhXG4iLAotCQkgIGh3bmQsIHdQYXJhbSk7Ci0gIGxwaGwtPmJSZWRyYXdGbGFnID0gd1BhcmFtOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNldEZvbnQKLSAqLwotc3RhdGljIExPTkcgTEJTZXRGb250KEhXTkQgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIEhEQzMyIGhkYzsKLQotICBpZiAod1BhcmFtID09IDApCi0gICAgbHBobC0+aEZvbnQgPSBHZXRTdG9ja09iamVjdDMyKFNZU1RFTV9GT05UKTsKLSAgZWxzZQotICAgIGxwaGwtPmhGb250ID0gKEhGT05UMTYpd1BhcmFtOwotCi0gIC8qIGEgbmV3IGZvbnQgbWVhbnMgcG9zc2libGUgbmV3IHRleHQgaGVpZ2h0ICovCi0gIC8qIGRvZXMgdGhpcyBtZWFuIHRoZSBoZWlnaHQgb2YgZWFjaCBlbnRyeSBtdXN0IGJlIHNlcGFyYXRlbHkgY2hhbmdlZD8gKi8KLSAgLyogb3IgYXJlIHdlIGd1YXJhbnRlZWQgdG8gZ2V0IGEgTEJTZXRGb250IGJlZm9yZSB0aGUgZmlyc3QgaW5zZXJ0L2FkZD8gKi8KLSAgaWYgKChoZGMgPSBHZXREQzMyKDApKSkKLSAgewotICAgICAgVEVYVE1FVFJJQzE2IHRtOwotICAgICAgR2V0VGV4dE1ldHJpY3MxNiggaGRjLCAmdG0gKTsKLSAgICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSB0bS50bUhlaWdodDsKLSAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCU2V0Rm9udDogIG5ldyBmb250ICVkIHdpdGggaGVpZ2h0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGxwaGwtPmhGb250LCBscGhsLT5TdGRJdGVtSGVpZ2h0KTsKLSAgICAgIFJlbGVhc2VEQzMyKCAwLCBoZGMgKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlBhaW50Ci0gKi8KLXN0YXRpYyBMT05HIExCUGFpbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBQQUlOVFNUUlVDVDE2IHBzOwotICBIQlJVU0gxNiBoQnJ1c2g7Ci0gIEhGT05UMzIgaE9sZEZvbnQ7Ci0gIEhEQzE2IGhkYyAgICA9IEJlZ2luUGFpbnQxNiggaHduZCwgJnBzICk7Ci0gIERDICAgICpkYyAgICA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBEQ19NQUdJQyk7Ci0gIFJFQ1QxNiAgcmVjdCwgcGFpbnRSZWN0LCBzY3JhdGNoUmVjdDsKLSAgaW50ICAgaSwgdG9wLCBoZWlnaHQsIG1heHdpZHRoLCBpcGM7Ci0KLSAgdG9wID0gMDsKLQotICBpZiAoIUlzV2luZG93VmlzaWJsZShod25kKSB8fCAhbHBobC0+YlJlZHJhd0ZsYWcpIHsKLSAgICBFbmRQYWludDE2KGh3bmQsICZwcyk7CiAgICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHZXRSZ25Cb3gxNihkYy0+dy5oR0NDbGlwUmduLCZwYWludFJlY3QpOwotICBHZXRDbGllbnRSZWN0MTYoaHduZCwgJnJlY3QpOwotICBJbnRlcnNlY3RSZWN0MTYoJnBhaW50UmVjdCwmcmVjdCwmcGFpbnRSZWN0KTsKLQotICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhkYywgbHBobC0+aEZvbnQpOwotCi0gIGhCcnVzaCA9IChIQlJVU0gxNilTZW5kTWVzc2FnZTMyQSggbHBobC0+aFBhcmVudCwgV01fQ1RMQ09MT1JMSVNUQk9YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0zMiloZGMsIChMUEFSQU0paHduZCk7Ci0gIGlmIChoQnJ1c2ggPT0gMCkgaEJydXNoID0gR2V0U3RvY2tPYmplY3QzMihXSElURV9CUlVTSCk7Ci0KLSAgRmlsbFJlY3QxNihoZGMsICZyZWN0LCBoQnJ1c2gpOwotCi0gIG1heHdpZHRoID0gcmVjdC5yaWdodDsKLSAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pIHsKLSAgICByZWN0LnJpZ2h0ID0gbHBobC0+Q29sdW1uc1dpZHRoOwotICB9Ci0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotCi0gIGxwaGwtPkl0ZW1zVmlzaWJsZSA9IDA7Ci0gIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gaXBjID0gMDsKLQotICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKLSAgICBpZiAobHBscyA9PSBOVUxMKSBicmVhazsKLQotICAgIGlmIChpID49IGxwaGwtPkZpcnN0VmlzaWJsZSkgewotICAgICAgaGVpZ2h0ID0gbHBscy0+bWlzLml0ZW1IZWlnaHQ7Ci0KLSAgICAgIGlmICh0b3AgPiAocmVjdC5ib3R0b20taGVpZ2h0KzEpKSB7Ci0JaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pIHsKLQkgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gTUFYKGxwaGwtPkl0ZW1zUGVyQ29sdW1uLCBpcGMpOwotCSAgaXBjID0gMDsKLQkgIHRvcCA9IDA7Ci0JICByZWN0LmxlZnQgKz0gbHBobC0+Q29sdW1uc1dpZHRoOwotCSAgcmVjdC5yaWdodCArPSBscGhsLT5Db2x1bW5zV2lkdGg7Ci0JICBpZiAocmVjdC5sZWZ0ID4gbWF4d2lkdGgpIGJyZWFrOwotCX0gZWxzZSB7Ci0JICBicmVhazsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGxwbHMtPml0ZW1SZWN0LnRvcCAgICA9IHRvcDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LmJvdHRvbSA9IHRvcCArIGhlaWdodDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LmxlZnQgICA9IHJlY3QubGVmdDsKLSAgICAgIGxwbHMtPml0ZW1SZWN0LnJpZ2h0ICA9IHJlY3QucmlnaHQ7Ci0KLSAgICAgIGlmKCBJbnRlcnNlY3RSZWN0MTYoJnNjcmF0Y2hSZWN0LCZwYWludFJlY3QsJmxwbHMtPml0ZW1SZWN0KSApCi0gICAgICAgewotICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMQlBhaW50OiBkcmF3aW5nIGl0ZW06ICVkICVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5sZWZ0LHRvcCxyZWN0LnJpZ2h0LHRvcCtoZWlnaHQsbHBscy0+aXRlbVN0YXRlKTsKLQotICAgICAgICBpZiAobHBobC0+T3duZXJEcmF3biAmJiAobHBobC0+SXRlbUZvY3VzZWQgPT0gaSkgJiYgR2V0Rm9jdXMzMigpID09IGh3bmQpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBMaXN0Qm94RHJhd0l0ZW0gKGh3bmQsIGxwaGwsIGhkYywgbHBscywgJmxwbHMtPml0ZW1SZWN0LCBPREFfRk9DVVMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBscy0+aXRlbVN0YXRlICYgfk9EU19GT0NVUyk7Ci0gICAgICAgICAgICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX0RSQVdFTlRJUkUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBscy0+aXRlbVN0YXRlICYgfk9EU19GT0NVUyk7Ci0gICAgICAgICAgICAgTGlzdEJveERyYXdJdGVtIChod25kLCBscGhsLCBoZGMsIGxwbHMsICZscGxzLT5pdGVtUmVjdCwgT0RBX0ZPQ1VTLCBscGxzLT5pdGVtU3RhdGUpOwotICAgICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIExpc3RCb3hEcmF3SXRlbSAoaHduZCwgbHBobCwgaGRjLCBscGxzLCAmbHBscy0+aXRlbVJlY3QsIE9EQV9EUkFXRU5USVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGxzLT5pdGVtU3RhdGUpOwotICAgICAgIH0KLQotICAgICAgdG9wICs9IGhlaWdodDsKLSAgICAgIGxwaGwtPkl0ZW1zVmlzaWJsZSsrOwotICAgICAgaXBjKys7Ci0gICAgfQotCi0gICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgfQotICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsbHBobCxGQUxTRSk7Ci0gIFNlbGVjdE9iamVjdDMyKGhkYyxoT2xkRm9udCk7Ci0gIEVuZFBhaW50MTYoIGh3bmQsICZwcyApOwotICByZXR1cm4gMDsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNldEZvY3VzCisgKiAgICAgICAgICAgTElTVEJPWF9IYW5kbGVNb3VzZU1vdmUKKyAqCisgKiBXTV9NT1VTRU1PVkUgaGFuZGxlci4KICAqLwotc3RhdGljIExPTkcgTEJTZXRGb2N1cyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyB2b2lkIExJU1RCT1hfSGFuZGxlTW91c2VNb3ZlKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHgsIElOVDMyIHkgKQogewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICBJTlQzMiBpbmRleDsKKyAgICBUSU1FUl9ESVJFQ1RJT04gZGlyOwogCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggV01fU0VURk9DVVMgZm9yICUwNHhcbiIsaHduZCk7Ci0gIGlmKCEobHBobC0+ZHdTdHlsZSAmIExCU19NVUxUSVBMRVNFTCkgKQotICAgICAgIGlmKCBscGhsLT5JdGVtc0NvdW50ICYmIGxwaGwtPkl0ZW1Gb2N1c2VkICE9IC0xKQotICAgICAgICAgewotICAgICAgICAgICBIREMzMiAgICAgICAgaERDID0gR2V0REMzMihod25kKTsKLSAgICAgICAgICAgSEZPTlQzMiBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhEQywgbHBobC0+aEZvbnQpOwotICAgICAgICAgICBMUExJU1RTVFJVQ1QgbHBsczsKLQotICAgICAgICAgICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCxscGhsLT5JdGVtRm9jdXNlZCk7Ci0gICAgICAgICAgIGxwbHMtPml0ZW1TdGF0ZSB8PSBPRFNfRk9DVVM7Ci0KLSAgICAgICAgICAgTGlzdEJveERyYXdJdGVtKGh3bmQsbHBobCxoREMsbHBscywmbHBscy0+aXRlbVJlY3QsIE9EQV9GT0NVUywgbHBscy0+aXRlbVN0YXRlKTsKLSAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoaERDLCBoT2xkRm9udCk7Ci0gICAgICAgICAgIFJlbGVhc2VEQzMyKGh3bmQsaERDKTsKLSAgICAgICAgIH0KLQotICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBMQk5fU0VURk9DVVMpOwotCi0gIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQktpbGxGb2N1cwotICovCi1zdGF0aWMgTE9ORyBMQktpbGxGb2N1cyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBXTV9LSUxMRk9DVVMgZm9yICUwNHhcbiIsaHduZCk7Ci0gIGlmICghKGxwaGwtPmR3U3R5bGUgJiBMQlNfTVVMVElQTEVTRUwpKQotICAgICB7Ci0gICAgICAgaWYoIGxwaGwtPkl0ZW1zQ291bnQgKQotICAgICAgICAgICBpZiggbHBobC0+SXRlbUZvY3VzZWQgIT0gLTEgKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgSERDMzIgICAgICAgIGhEQyA9IEdldERDMzIoaHduZCk7Ci0gICAgICAgICAgICAgIEhGT05UMzIgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMihoREMsIGxwaGwtPmhGb250KTsKLSAgICAgICAgICAgICAgTFBMSVNUU1RSVUNUIGxwbHM7Ci0KLSAgICAgICAgICAgICAgbHBscyA9IExpc3RCb3hHZXRJdGVtKGxwaGwsbHBobC0+SXRlbUZvY3VzZWQpOwotICAgICAgICAgICAgICBscGxzLT5pdGVtU3RhdGUgJj0gfk9EU19GT0NVUzsKLQotICAgICAgICAgICAgICBMaXN0Qm94RHJhd0l0ZW0oaHduZCxscGhsLGhEQyxscGxzLCZscGxzLT5pdGVtUmVjdCwgT0RBX0ZPQ1VTLCBscGxzLT5pdGVtU3RhdGUpOwotICAgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihoREMsIGhPbGRGb250KTsKLSAgICAgICAgICAgICAgUmVsZWFzZURDMzIoaHduZCxoREMpOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCS2lsbEZvY3VzOiBubyBmb2N1c2VkIGl0ZW0hXG4iKTsKLSAgICAgfQotICBlbHNlCi0gICAgIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLQotICBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihscGhsLCBMQk5fS0lMTEZPQ1VTKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJSZXNldENvbnRlbnQKLSAqLwotc3RhdGljIExPTkcgTEJSZXNldENvbnRlbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfUkVTRVRDT05URU5UICFcbiIpOwotICBMaXN0Qm94UmVzZXRDb250ZW50KGxwaGwpOwotICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsIGxwaGwsIFRSVUUpOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJEaXIKLSAqLwotc3RhdGljIExPTkcgTEJEaXIoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gICAgTE9ORyByZXQ7Ci0gICAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9ESVIgIVxuIik7Ci0KLSAgICByZXQgPSBMaXN0Qm94RGlyZWN0b3J5KGxwaGwsIHdQYXJhbSwgKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOwotICAgIExpc3RCb3hVcGRhdGVXaW5kb3coaHduZCwgbHBobCwgVFJVRSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJBZGRTdHJpbmcKLSAqLwotc3RhdGljIExPTkcgTEJBZGRTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIFdPUkQgIHdSZXQ7Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCi0gIHdSZXQgPSBMaXN0Qm94QWRkU3RyaW5nKGxwaGwsIChTRUdQVFIpbFBhcmFtKTsKLQotICBMaXN0Qm94VXBkYXRlV2luZG93KGh3bmQsbHBobCxUUlVFKTsKLSAgcmV0dXJuIHdSZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0VGV4dAotICovCi1zdGF0aWMgTE9ORyBMQkdldFRleHQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExPTkcgICB3UmV0OwotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTEJfR0VUVEVYVCAgd1BhcmFtPSVkXG4iLHdQYXJhbSk7Ci0gIHdSZXQgPSBMaXN0Qm94R2V0VGV4dChscGhsLCB3UGFyYW0sIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKLQotICByZXR1cm4gd1JldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJJbnNlcnRTdHJpbmcKLSAqLwotc3RhdGljIExPTkcgTEJJbnNlcnRTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIFdPUkQgIHdSZXQ7Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCi0gIGlmIChscGhsLT5IYXNTdHJpbmdzKQotICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIHdQYXJhbSwgKExQQ1NUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKLSAgZWxzZQotICAgIHdSZXQgPSBMaXN0Qm94SW5zZXJ0U3RyaW5nKGxwaGwsIHdQYXJhbSwgKExQQ1NUUilsUGFyYW0pOwotCi0gIExpc3RCb3hVcGRhdGVXaW5kb3coaHduZCxscGhsLFRSVUUpOwotICByZXR1cm4gd1JldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJEZWxldGVTdHJpbmcKLSAqLwotc3RhdGljIExPTkcgTEJEZWxldGVTdHJpbmcoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBMT05HIGxSZXQgPSBMaXN0Qm94RGVsZXRlU3RyaW5nKGxwaGwsd1BhcmFtKTsKLSAgCi0gIExpc3RCb3hVcGRhdGVXaW5kb3coaHduZCxscGhsLFRSVUUpOwotICByZXR1cm4gbFJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJGaW5kU3RyaW5nCi0gKi8KLXN0YXRpYyBMT05HIExCRmluZFN0cmluZyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBsYkZpbmRTdHJpbmcobHBobCwgd1BhcmFtLCAoU0VHUFRSKWxQYXJhbSwgTUFUQ0hfU1VCU1RSKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJGaW5kU3RyaW5nRXhhY3QKLSAqLwotc3RhdGljIExPTkcgTEJGaW5kU3RyaW5nRXhhY3QoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICByZXR1cm4gbGJGaW5kU3RyaW5nKGxwaGwsIHdQYXJhbSwgKFNFR1BUUilsUGFyYW0sIE1BVENIX0VYQUNUKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRDYXJldEluZGV4Ci0gKi8KLXN0YXRpYyBMT05HIExCR2V0Q2FyZXRJbmRleChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBscGhsLT5JdGVtRm9jdXNlZDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRDb3VudAotICovCi1zdGF0aWMgTE9ORyBMQkdldENvdW50KEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgcmV0dXJuIGxwaGwtPkl0ZW1zQ291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0Q3VyU2VsCi0gKi8KLXN0YXRpYyBMT05HIExCR2V0Q3VyU2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsOwotCi0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9HRVRDVVJTRUwgJWkgIVxuIiwgCi0JCSAgbHBobC0+SXRlbUZvY3VzZWQpOwotICByZXR1cm4gbHBobC0+SXRlbUZvY3VzZWQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0SG9yaXpvbnRhbEV4dGVudAotICovCi1zdGF0aWMgTE9ORyBMQkdldEhvcml6b250YWxFeHRlbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17ICAgIAotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRJdGVtSGVpZ2h0Ci0gKi8KLXN0YXRpYyBMT05HIExCR2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0gKGxwaGwsIHdQYXJhbSk7Ci0gIAotICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICByZXR1cm4gbHBscy0+bWlzLml0ZW1IZWlnaHQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0SXRlbVJlY3QKLSAqLwotc3RhdGljIExPTkcgTEJHZXRJdGVtUmVjdChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIHJldHVybiBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgd1BhcmFtLCBQVFJfU0VHX1RPX0xJTihsUGFyYW0pKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRTZWwKLSAqLwotc3RhdGljIExPTkcgTEJHZXRTZWwoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBpbnQgICAgICAgIGlTZWwgPSBMaXN0Qm94R2V0U2VsKGxwaGwsIHdQYXJhbSk7Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZG5pbXAsIkxCR2V0U2VsOiBpdGVtICV1IC0gJWlcbiIsd1BhcmFtLGlTZWwpOwotCi0gIHJldHVybiAoaVNlbCk/IDEgOiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQkdldFNlbENvdW50Ci0gKi8KLXN0YXRpYyBMT05HIExCR2V0U2VsQ291bnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgaW50ICAgICAgICAgIGNudCA9IDA7Ci0gIGludCAgICAgICAgICBpdGVtcyA9IDA7Ci0KLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICApKSAKLQkgcmV0dXJuIExCX0VSUjsKLQotICBmb3IoIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICAgICAgIGxwbHM7Ci0gICAgICAgbHBscyA9IGxwbHMtPmxwTmV4dCApCi0JewotCSAgIGl0ZW1zKys7Ci0gICAgICAgICAgIGlmIChscGxzLT5pdGVtU3RhdGUgKSAKLSAgICAgICAgICAgICAgIGNudCsrOwotICB9Ci0KLSAgcmV0dXJuIGNudDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRTZWxJdGVtcwotICovCi1zdGF0aWMgTE9ORyBMQkdldFNlbEl0ZW1zKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzOwotICBpbnQgY250LCBpZHg7Ci0gIGludCAqbHBJdGVtcyA9IFBUUl9TRUdfVE9fTElOKGxQYXJhbSk7Ci0KLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICApKSAKLSAgICAgICAgcmV0dXJuIExCX0VSUjsKLQotICBpZiAod1BhcmFtID09IDApIHJldHVybiAwOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICBjbnQgPSAwOyBpZHggPSAwOwotCi0gIHdoaWxlIChscGxzICE9IE5VTEwpIHsKLSAgICBpZiAobHBscy0+aXRlbVN0YXRlID4gMCkgbHBJdGVtc1tjbnQrK10gPSBpZHg7Ci0KLSAgICBpZiAoY250ID09IHdQYXJhbSkgYnJlYWs7Ci0gICAgaWR4Kys7Ci0gICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKLSAgfQotCi0gIHJldHVybiBjbnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0VGV4dExlbgotICovCi1zdGF0aWMgTE9ORyBMQkdldFRleHRMZW4oSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCx3UGFyYW0pOwotCi0gIGlmIChscGxzID09IE5VTEwgfHwgIWxwaGwtPkhhc1N0cmluZ3MpIHJldHVybiBMQl9FUlI7Ci0gIHJldHVybiBzdHJsZW4obHBscy0+aXRlbVRleHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQkdldERsZ0NvZGUKLSAqLwotc3RhdGljIExPTkcgTEJHZXREbGdDb2RlKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICByZXR1cm4gRExHQ19XQU5UQVJST1dTIHwgRExHQ19XQU5UQ0hBUlM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCR2V0VG9wSW5kZXgKLSAqLwotc3RhdGljIExPTkcgTEJHZXRUb3BJbmRleChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0KLSAgcmV0dXJuIGxwaGwtPkZpcnN0VmlzaWJsZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNlbGVjdFN0cmluZwotICovCi1zdGF0aWMgTE9ORyBMQlNlbGVjdFN0cmluZyhIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIElOVCAgaVJldDsKLQotICBpUmV0ID0gbGJGaW5kU3RyaW5nKGxwaGwsIHdQYXJhbSwgKFNFR1BUUilsUGFyYW0sIE1BVENIX1NVQlNUUik7Ci0KLSAgaWYoIGlSZXQgIT0gTEJfRVJSKQorICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCiAgICAgewotICAgICAgaWYoIGxwaGwtPmR3U3R5bGUgJiAoTEJTX01VTFRJUExFU0VMIHwgTEJTX0VYVEVOREVEU0VMKSApCi0gICAgICAgICBMaXN0Qm94U2V0U2VsKGxwaGwsaVJldCxUUlVFKTsKLSAgICAgIGVsc2UKLSAgICAgICAgIExpc3RCb3hTZXRDdXJTZWwobHBobCxpUmV0KTsKKyAgICAgICAgaWYgKHkgPCAwKSB5ID0gMDsKKyAgICAgICAgZWxzZSBpZiAoeSA+PSBkZXNjci0+aXRlbV9oZWlnaHQgKiBkZXNjci0+cGFnZV9zaXplKQorICAgICAgICAgICAgeSA9IGRlc2NyLT5pdGVtX2hlaWdodCAqIGRlc2NyLT5wYWdlX3NpemUgLSAxOwogCi0gICAgICBscGhsLT5JdGVtRm9jdXNlZCA9IGlSZXQ7Ci0gICAgICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCAwLCBUUlVFICk7CisgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgZGlyID0gTEJfVElNRVJfTEVGVDsKKyAgICAgICAgICAgIHggPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHggPj0gZGVzY3ItPndpZHRoKQorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSBMQl9USU1FUl9SSUdIVDsKKyAgICAgICAgICAgIHggPSBkZXNjci0+d2lkdGggLSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgZGlyID0gTEJfVElNRVJfTk9ORTsgIC8qIGluc2lkZSAqLwogICAgIH0KLSAgcmV0dXJuIGlSZXQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHkgPCAwKSBkaXIgPSBMQl9USU1FUl9VUDsgIC8qIGFib3ZlICovCisgICAgICAgIGVsc2UgaWYgKHkgPj0gZGVzY3ItPmhlaWdodCkgZGlyID0gTEJfVElNRVJfRE9XTjsgIC8qIGJlbG93ICovCisgICAgICAgIGVsc2UgZGlyID0gTEJfVElNRVJfTk9ORTsgIC8qIGluc2lkZSAqLworICAgIH0KKworICAgIGluZGV4ID0gTElTVEJPWF9HZXRJdGVtRnJvbVBvaW50KCB3bmQsIGRlc2NyLCB4LCB5ICk7CisgICAgaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IGRlc2NyLT5mb2N1c19pdGVtOworICAgIGlmICghTElTVEJPWF9IYW5kbGVUaW1lciggd25kLCBkZXNjciwgaW5kZXgsIGRpciApKSBkaXIgPSBMQl9USU1FUl9OT05FOworCisgICAgLyogU3RhcnQvc3RvcCB0aGUgc3lzdGVtIHRpbWVyICovCisKKyAgICBpZiAoZGlyICE9IExCX1RJTUVSX05PTkUpCisgICAgICAgIFNldFN5c3RlbVRpbWVyMzIoIHduZC0+aHduZFNlbGYsIExCX1RJTUVSX0lELCBMQl9TQ1JPTExfVElNRU9VVCwgTlVMTCk7CisgICAgZWxzZSBpZiAoTElTVEJPWF9UaW1lciAhPSBMQl9USU1FUl9OT05FKQorICAgICAgICBLaWxsU3lzdGVtVGltZXIzMiggd25kLT5od25kU2VsZiwgTEJfVElNRVJfSUQgKTsKKyAgICBMSVNUQk9YX1RpbWVyID0gZGlyOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCU2VsSXRlbVJhbmdlCisgKiAgICAgICAgICAgTElTVEJPWF9IYW5kbGVLZXlEb3duCiAgKi8KLXN0YXRpYyBMT05HIExCU2VsSXRlbVJhbmdlKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQorc3RhdGljIExSRVNVTFQgTElTVEJPWF9IYW5kbGVLZXlEb3duKCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0zMiB3UGFyYW0gKQogewotICBMUEhFQURMSVNUICAgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotICBMUExJU1RTVFJVQ1QgbHBsczsKLSAgV09SRCAgICAgICAgIGNudDsKLSAgV09SRCAgICAgICAgIGZpcnN0ID0gTE9XT1JEKGxQYXJhbSk7Ci0gIFdPUkQgICAgICAgICBsYXN0ID0gSElXT1JEKGxQYXJhbSk7Ci0gIEJPT0wgICAgICAgICBzZWxlY3QgPSB3UGFyYW07Ci0KLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICApKSAKLSAgICAgICAgcmV0dXJuIExCX0VSUjsKLQotICBpZiAoZmlyc3QgPj0gbHBobC0+SXRlbXNDb3VudCB8fAotICAgICAgbGFzdCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwotCi0gIGxwbHMgPSBscGhsLT5scEZpcnN0OwotICBjbnQgPSAwOwotCi0gIHdoaWxlIChscGxzICE9IE5VTEwpIHsKLSAgICBpZiAoY250KysgPj0gZmlyc3QpCi0gICAgICBscGxzLT5pdGVtU3RhdGUgPSBzZWxlY3QgPyBscGxzLT5pdGVtU3RhdGUgfCBPRFNfU0VMRUNURUQgOiAwOwotCi0gICAgaWYgKGNudCA+IGxhc3QpCi0gICAgICBicmVhazsKLQotICAgIGxwbHMgPSBscGxzLT5scE5leHQ7Ci0gIH0KLQotICByZXR1cm4gMDsKKyAgICBJTlQzMiBjYXJldCA9IC0xOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfV0FOVEtFWUJPQVJESU5QVVQpCisgICAgeworICAgICAgICBjYXJldCA9IFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIFdNX1ZLRVlUT0lURU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oTE9XT1JEKHdQYXJhbSksIGRlc2NyLT5mb2N1c19pdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kLT5od25kU2VsZiApOworICAgICAgICBpZiAoY2FyZXQgPT0gLTIpIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY2FyZXQgPT0gLTEpIHN3aXRjaCh3UGFyYW0pCisgICAgeworICAgIGNhc2UgVktfTEVGVDoKKyAgICAgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSUNPTFVNTikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRlc2NyLT5mb2N1c19pdGVtID49IGRlc2NyLT5wYWdlX3NpemUpCisgICAgICAgICAgICAgICAgY2FyZXQgPSBkZXNjci0+Zm9jdXNfaXRlbSAtIGRlc2NyLT5wYWdlX3NpemU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIFZLX1VQOgorICAgICAgICBjYXJldCA9IGRlc2NyLT5mb2N1c19pdGVtIC0gMTsKKyAgICAgICAgaWYgKGNhcmV0IDwgMCkgY2FyZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1JJR0hUOgorICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVzY3ItPmZvY3VzX2l0ZW0gKyBkZXNjci0+cGFnZV9zaXplIDwgZGVzY3ItPm5iX2l0ZW1zKQorICAgICAgICAgICAgICAgIGNhcmV0ID0gZGVzY3ItPmZvY3VzX2l0ZW0gKyBkZXNjci0+cGFnZV9zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBWS19ET1dOOgorICAgICAgICBjYXJldCA9IGRlc2NyLT5mb2N1c19pdGVtICsgMTsKKyAgICAgICAgaWYgKGNhcmV0ID49IGRlc2NyLT5uYl9pdGVtcykgY2FyZXQgPSBkZXNjci0+bmJfaXRlbXMgLSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1BSSU9SOgorICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJQ09MVU1OKQorICAgICAgICB7CisgICAgICAgICAgICBJTlQzMiBwYWdlID0gZGVzY3ItPndpZHRoIC8gZGVzY3ItPmNvbHVtbl93aWR0aDsKKyAgICAgICAgICAgIGlmIChwYWdlIDwgMSkgcGFnZSA9IDE7CisgICAgICAgICAgICBjYXJldCA9IGRlc2NyLT5mb2N1c19pdGVtIC0gKHBhZ2UgKiBkZXNjci0+cGFnZV9zaXplKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBjYXJldCA9IGRlc2NyLT5mb2N1c19pdGVtLUxJU1RCT1hfR2V0Q3VycmVudFBhZ2VTaXplKHduZCxkZXNjcikrMTsKKyAgICAgICAgaWYgKGNhcmV0IDwgMCkgY2FyZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX05FWFQ6CisgICAgICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfTVVMVElDT0xVTU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIElOVDMyIHBhZ2UgPSBkZXNjci0+d2lkdGggLyBkZXNjci0+Y29sdW1uX3dpZHRoOworICAgICAgICAgICAgaWYgKHBhZ2UgPCAxKSBwYWdlID0gMTsKKyAgICAgICAgICAgIGNhcmV0ID0gZGVzY3ItPmZvY3VzX2l0ZW0gKyAocGFnZSAqIGRlc2NyLT5wYWdlX3NpemUpIC0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGNhcmV0ID0gZGVzY3ItPmZvY3VzX2l0ZW0rTElTVEJPWF9HZXRDdXJyZW50UGFnZVNpemUod25kLGRlc2NyKS0xOworICAgICAgICBpZiAoY2FyZXQgPj0gZGVzY3ItPm5iX2l0ZW1zKSBjYXJldCA9IGRlc2NyLT5uYl9pdGVtcyAtIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVktfSE9NRToKKyAgICAgICAgY2FyZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX0VORDoKKyAgICAgICAgY2FyZXQgPSBkZXNjci0+bmJfaXRlbXMgLSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFZLX1NQQUNFOgorICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX0VYVEVOREVEU0VMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIShHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApKQorICAgICAgICAgICAgICAgIGRlc2NyLT5hbmNob3JfaXRlbSA9IGRlc2NyLT5mb2N1c19pdGVtOworICAgICAgICAgICAgTElTVEJPWF9Nb3ZlQ2FyZXQoIHduZCwgZGVzY3IsIGRlc2NyLT5mb2N1c19pdGVtLCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX01VTFRJUExFU0VMKQorICAgICAgICAgICAgTElTVEJPWF9TZXRTZWxlY3Rpb24oIHduZCwgZGVzY3IsIGRlc2NyLT5mb2N1c19pdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkZXNjci0+aXRlbXNbZGVzY3ItPmZvY3VzX2l0ZW1dLnNlbGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKSAhPSAwICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2FyZXQgPj0gMCkKKyAgICB7CisgICAgICAgIGlmICgoZGVzY3ItPnN0eWxlICYgTEJTX0VYVEVOREVEU0VMKSAmJgorICAgICAgICAgICAgIShHZXRLZXlTdGF0ZSggVktfU0hJRlQgKSAmIDB4ODAwMCkpCisgICAgICAgICAgICBkZXNjci0+YW5jaG9yX2l0ZW0gPSBjYXJldDsKKyAgICAgICAgTElTVEJPWF9Nb3ZlQ2FyZXQoIHduZCwgZGVzY3IsIGNhcmV0LCBUUlVFICk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCU2V0Q2FyZXRJbmRleAorICogICAgICAgICAgIExJU1RCT1hfSGFuZGxlQ2hhcgogICovCi1zdGF0aWMgTE9ORyBMQlNldENhcmV0SW5kZXgoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgTFJFU1VMVCBMSVNUQk9YX0hhbmRsZUNoYXIoIFdORCAqd25kLCBMQl9ERVNDUiAqZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSApCiB7Ci0gIExQSEVBRExJU1QgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGludCAgICAgICAgICBpOworICAgIElOVDMyIGluZGV4OworICAgIGNoYXIgc3RyWzJdID0geyB3UGFyYW0gJiAweGZmLCAnXDAnIH07CiAKLSAgaWYgKCEobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICkpIHJldHVybiAwOwotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxCU2V0Q2FyZXRJbmRleDogaHduZCAlMDR4IG49JWlcbiIsaHduZCx3UGFyYW0pOyAgCi0KLSAgaWYgKHdQYXJhbSA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOwotCi0gIGxwaGwtPkl0ZW1Gb2N1c2VkID0gd1BhcmFtOwotICBpID0gTGlzdEJveFNjcm9sbFRvRm9jdXMgKGxwaGwpOwotCi0gIFNldFNjcm9sbFBvczMyKGh3bmQsIFNCX1ZFUlQsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0gIGlmKGkpCi0gICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOwotIAotICByZXR1cm4gMTsKKyAgICBpbmRleCA9IExJU1RCT1hfRmluZFN0cmluZyggd25kLCBkZXNjciwgZGVzY3ItPmZvY3VzX2l0ZW0sIHN0ciwgRkFMU0UgKTsKKyAgICBpZiAoaW5kZXggIT0gTEJfRVJSKSBMSVNUQk9YX01vdmVDYXJldCggd25kLCBkZXNjciwgaW5kZXgsIFRSVUUgKTsKKyAgICByZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJTZXRDb2x1bW5XaWR0aAotICovCi1zdGF0aWMgTE9ORyBMQlNldENvbHVtbldpZHRoKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgbHBobC0+Q29sdW1uc1dpZHRoID0gd1BhcmFtOwotICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0gIHJldHVybiAwOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNldEhvcml6b250YWxFeHRlbnQKKyAqICAgICAgICAgICBMSVNUQk9YX0NyZWF0ZQogICovCi1zdGF0aWMgTE9ORyBMQlNldEhvcml6b250YWxFeHRlbnQoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCitzdGF0aWMgQk9PTDMyIExJU1RCT1hfQ3JlYXRlKCBXTkQgKnduZCApCiB7Ci0gIHJldHVybiAwOwotfQorICAgIExCX0RFU0NSICpkZXNjcjsKKyAgICBNRUFTVVJFSVRFTVNUUlVDVDMyIG1pczsKKyAgICBSRUNUMzIgcmVjdDsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJHZXRJdGVtRGF0YQotICovCi1zdGF0aWMgTE9ORyBMQkdldEl0ZW1EYXRhKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxCX0dFVElURU1EQVRBIHdQYXJhbT0leFxuIiwgd1BhcmFtKTsKLSAgcmV0dXJuIExpc3RCb3hHZXRJdGVtRGF0YShscGhsLCB3UGFyYW0pOwotfQorICAgIGlmICghKGRlc2NyID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKmRlc2NyKSApKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGRlc2NyLT5oZWFwID0gSGVhcENyZWF0ZSggMCwgMHgxMDAwMCwgMCApKSkKKyAgICB7CisgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXNjciApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIEdldENsaWVudFJlY3QzMiggd25kLT5od25kU2VsZiwgJnJlY3QgKTsKKyAgICBkZXNjci0+b3duZXIgICAgICAgICA9IEdldFBhcmVudDMyKCB3bmQtPmh3bmRTZWxmICk7CisgICAgZGVzY3ItPnN0eWxlICAgICAgICAgPSB3bmQtPmR3U3R5bGU7CisgICAgZGVzY3ItPndpZHRoICAgICAgICAgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICAgIGRlc2NyLT5oZWlnaHQgICAgICAgID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDsKKyAgICBkZXNjci0+aXRlbXMgICAgICAgICA9IE5VTEw7CisgICAgZGVzY3ItPm5iX2l0ZW1zICAgICAgPSAwOworICAgIGRlc2NyLT50b3BfaXRlbSAgICAgID0gMDsKKyAgICBkZXNjci0+c2VsZWN0ZWRfaXRlbSA9IC0xOworICAgIGRlc2NyLT5mb2N1c19pdGVtICAgID0gMDsKKyAgICBkZXNjci0+YW5jaG9yX2l0ZW0gICA9IC0xOworICAgIGRlc2NyLT5pdGVtX2hlaWdodCAgID0gMTsKKyAgICBkZXNjci0+cGFnZV9zaXplICAgICA9IDE7CisgICAgZGVzY3ItPmNvbHVtbl93aWR0aCAgPSAxNTA7CisgICAgZGVzY3ItPmhvcnpfZXh0ZW50ICAgPSAod25kLT5kd1N0eWxlICYgV1NfSFNDUk9MTCkgPyAxIDogMDsKKyAgICBkZXNjci0+aG9yel9wb3MgICAgICA9IDA7CisgICAgZGVzY3ItPm5iX3RhYnMgICAgICAgPSAwOworICAgIGRlc2NyLT50YWJzICAgICAgICAgID0gTlVMTDsKKyAgICBkZXNjci0+Y2FyZXRfb24gICAgICA9IFRSVUU7CisgICAgZGVzY3ItPmZvbnQgICAgICAgICAgPSAwOworICAgIGRlc2NyLT5sb2NhbGUgICAgICAgID0gMDsgIC8qIEZJWE1FICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCU2V0SXRlbURhdGEKLSAqLwotc3RhdGljIExPTkcgTEJTZXRJdGVtRGF0YShIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMQl9TRVRJVEVNREFUQSAgd1BhcmFtPSV4ICBsUGFyYW09JWx4XG4iLCB3UGFyYW0sIGxQYXJhbSk7Ci0gIHJldHVybiBMaXN0Qm94U2V0SXRlbURhdGEobHBobCwgd1BhcmFtLCBsUGFyYW0pOwotfQorICAgICooTEJfREVTQ1IgKiopd25kLT53RXh0cmEgPSBkZXNjcjsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJTZXRUYWJTdG9wcwotICovCi1zdGF0aWMgTE9ORyBMQlNldFRhYlN0b3BzKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUICBscGhsOworICAgIGlmIChkZXNjci0+c3R5bGUgJiBMQlNfRVhURU5ERURTRUwpIGRlc2NyLT5zdHlsZSB8PSBMQlNfTVVMVElQTEVTRUw7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19NVUxUSUNPTFVNTikgZGVzY3ItPnN0eWxlICY9IH5MQlNfT1dORVJEUkFXVkFSSUFCTEU7CisgICAgaWYgKGRlc2NyLT5zdHlsZSAmIExCU19PV05FUkRSQVdWQVJJQUJMRSkgZGVzY3ItPnN0eWxlIHw9IExCU19OT0lOVEVHUkFMSEVJR0hUOworICAgIGRlc2NyLT5pdGVtX2hlaWdodCA9IExJU1RCT1hfU2V0Rm9udCggd25kLCBkZXNjciwgMCApOwogCi0gIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKQorICAgIHsKKyAgICAgICAgbWlzLkN0bFR5cGUgICAgPSBPRFRfTElTVEJPWDsKKyAgICAgICAgbWlzLkN0bElEICAgICAgPSB3bmQtPndJRG1lbnU7CisgICAgICAgIG1pcy5pdGVtSUQgICAgID0gMDsKKyAgICAgICAgbWlzLml0ZW1XaWR0aCAgPSAwOworICAgICAgICBtaXMuaXRlbURhdGEgICA9IDA7CisgICAgICAgIG1pcy5pdGVtSGVpZ2h0ID0gZGVzY3ItPml0ZW1faGVpZ2h0OworICAgICAgICBTZW5kTWVzc2FnZTMyQSggZGVzY3ItPm93bmVyLCBXTV9NRUFTVVJFSVRFTSwgd25kLT53SURtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkmbWlzICk7CisgICAgICAgIGRlc2NyLT5pdGVtX2hlaWdodCA9IG1pcy5pdGVtSGVpZ2h0ID8gbWlzLml0ZW1IZWlnaHQgOiAxOworICAgIH0KIAotICBpZiAobHBobC0+VGFiU3RvcHMgIT0gTlVMTCkgewotICAgIGxwaGwtPmlOdW1TdG9wcyA9IDA7Ci0gICAgZnJlZSAobHBobC0+VGFiU3RvcHMpOwotICB9Ci0KLSAgbHBobC0+VGFiU3RvcHMgPSBtYWxsb2MgKHdQYXJhbSAqIHNpemVvZiAoc2hvcnQpKTsKLSAgaWYgKGxwaGwtPlRhYlN0b3BzKSB7Ci0gICAgbHBobC0+aU51bVN0b3BzID0gd1BhcmFtOwotICAgIG1lbWNweSAobHBobC0+VGFiU3RvcHMsIFBUUl9TRUdfVE9fTElOKGxQYXJhbSksIHdQYXJhbSAqIHNpemVvZiAoc2hvcnQpKTsKICAgICByZXR1cm4gVFJVRTsKLSAgfQotCi0gIHJldHVybiBGQUxTRTsKIH0KIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNldEN1clNlbAorICogICAgICAgICAgIExJU1RCT1hfRGVzdHJveQogICovCi1zdGF0aWMgTE9ORyBMQlNldEN1clNlbChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3N0YXRpYyBCT09MMzIgTElTVEJPWF9EZXN0cm95KCBXTkQgKnduZCwgTEJfREVTQ1IgKmRlc2NyICkKIHsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIFdPUkQgIHdSZXQ7Ci0KLSAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9TRVRDVVJTRUwgd1BhcmFtPSV4ICFcbiIsIAotCQkgIHdQYXJhbSk7Ci0KLSAgd1JldCA9IExpc3RCb3hTZXRDdXJTZWwobHBobCwgd1BhcmFtKTsKLQotICBTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotICBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0KLSAgcmV0dXJuIHdSZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIExCU2V0U2VsCi0gKi8KLXN0YXRpYyBMT05HIExCU2V0U2VsKEhXTkQgaHduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQotewotICBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgUkVDVDE2IHJlY3Q7Ci0gIGludCBpUmV0OwotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfU0VUU0VMIHdQYXJhbT0leCBsUGFyYW09JWxYICFcbiIsIHdQYXJhbSwgbFBhcmFtKTsKLQotICBpUmV0ID0gTGlzdEJveFNldFNlbChscGhsLCBMT1dPUkQobFBhcmFtKSwgd1BhcmFtKTsKLQotICBpZiggaVJldCA+IDEgKSBJbnZhbGlkYXRlUmVjdDMyKCBod25kLCBOVUxMLCBUUlVFICk7Ci0gIGVsc2UgaWYoIGlSZXQgIT0gTEJfRVJSICkKLSAgICAgIHsKLSAgICAgICAgaWYoIGxwaGwtPmR3U3R5bGUgJiBMQlNfRVhURU5ERURTRUwgJiYKLSAgICAgICAgICAgIGxwaGwtPkl0ZW1Gb2N1c2VkICE9IExPV09SRChsUGFyYW0pICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0Qm94R2V0SXRlbVJlY3QobHBobCwgbHBobC0+SXRlbUZvY3VzZWQgLCAmcmVjdCk7Ci0gICAgICAgICAgICBJbnZhbGlkYXRlUmVjdDE2KCBod25kLCAmcmVjdCwgVFJVRSApOwotICAgICAgICAgICAgbHBobC0+SXRlbUZvY3VzZWQgPSBMT1dPUkQobFBhcmFtKTsKLSAgICAgICAgICB9Ci0gICAgICAgIExpc3RCb3hHZXRJdGVtUmVjdChscGhsLExPV09SRChsUGFyYW0pLCZyZWN0KTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QxNiggaHduZCwgJnJlY3QsIFRSVUUgKTsKLSAgICAgIH0KLQotICByZXR1cm4gKGlSZXQgPT0gKFdPUkQpTEJfRVJSKT8gTEJfRVJSOiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMQlNldFRvcEluZGV4Ci0gKi8KLXN0YXRpYyBMT05HIExCU2V0VG9wSW5kZXgoSFdORCBod25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCi17Ci0gIExQSEVBRExJU1QgbHBobCA9IExpc3RCb3hHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfU0VUVE9QSU5ERVggd1BhcmFtPSV4ICFcbiIsCi0JCSAgd1BhcmFtKTsKLSAgbHBobC0+Rmlyc3RWaXNpYmxlID0gd1BhcmFtOwotICBTZXRTY3JvbGxQb3MzMihod25kLCBTQl9WRVJULCBscGhsLT5GaXJzdFZpc2libGUsIFRSVUUpOwotCi0gIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLQotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTEJTZXRJdGVtSGVpZ2h0Ci0gKi8KLXN0YXRpYyBMT05HIExCU2V0SXRlbUhlaWdodChIV05EIGh3bmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKLXsKLSAgTFBIRUFETElTVCBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gIFdPUkQgd1JldDsKLSAgCi0gIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3ggTEJfU0VUSVRFTUhFSUdIVCB3UGFyYW09JXggbFBhcmFtPSVsWCAhXG4iLCB3UGFyYW0sIGxQYXJhbSk7Ci0gIHdSZXQgPSBMaXN0Qm94U2V0SXRlbUhlaWdodChscGhsLCB3UGFyYW0sIGxQYXJhbSk7Ci0gIEludmFsaWRhdGVSZWN0MzIoIGh3bmQsIE5VTEwsIFRSVUUgKTsKLSAgcmV0dXJuIHdSZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJICAgICBMQlBhc3NUb1BhcmVudAotICovCi1zdGF0aWMgTFJFU1VMVCBMQlBhc3NUb1BhcmVudChIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotICBXTkQqIHB0clduZCA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOyAgCi0KLSAgaWYoIHB0clduZCApCi0gICAgICBpZiggLyogIShwdHJXbmQtPmR3RXhTdHlsZSAmIFdTX0VYX05PUEFSRU5UTk9USUZZKSAmJiAqLyAKLSAgICAgICAgICBwdHJXbmQtPnBhcmVudCApIAotICAgICAgICAgIHJldHVybiBTZW5kTWVzc2FnZTE2KHB0clduZC0+cGFyZW50LT5od25kU2VsZixtZXNzYWdlLHdQYXJhbSxsUGFyYW0pOwotICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTGlzdEJveFduZFByb2MgCi0gKi8KLUxSRVNVTFQgTGlzdEJveFduZFByb2MoSFdORCBod25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsgCi0gICAgc3dpdGNoIChtZXNzYWdlKSB7Ci0gICAgIGNhc2UgV01fQ1JFQVRFOiByZXR1cm4gTEJDcmVhdGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0RFU1RST1k6IHJldHVybiBMQkRlc3Ryb3koaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0dFVERMR0NPREU6IHJldHVybiBMQkdldERsZ0NvZGUoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1ZTQ1JPTEw6IHJldHVybiBMQlZTY3JvbGwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0hTQ1JPTEw6IHJldHVybiBMQkhTY3JvbGwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOiByZXR1cm4gTEJMQnV0dG9uRG93bihod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fTEJVVFRPTlVQOiByZXR1cm4gTEJMQnV0dG9uVXAoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX1JCVVRUT05VUDogcmV0dXJuIExCUkJ1dHRvblVwKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOiByZXR1cm4gTEJSQnV0dG9uVXAoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX01PVVNFTU9WRTogcmV0dXJuIExCTW91c2VNb3ZlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9LRVlET1dOOiByZXR1cm4gTEJLZXlEb3duKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9DSEFSOiByZXR1cm4gTEJDaGFyKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9TRVRGT05UOiByZXR1cm4gTEJTZXRGb250KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9TRVRSRURSQVc6IHJldHVybiBMQlNldFJlZHJhdyhod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgV01fUEFJTlQ6IHJldHVybiBMQlBhaW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9TRVRGT0NVUzogcmV0dXJuIExCU2V0Rm9jdXMoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIFdNX0tJTExGT0NVUzogcmV0dXJuIExCS2lsbEZvY3VzKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBXTV9OQ0NBTENTSVpFOiByZXR1cm4gTEJOQ0NhbGNTaXplKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9SRVNFVENPTlRFTlQxNjogcmV0dXJuIExCUmVzZXRDb250ZW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9ESVIxNjogcmV0dXJuIExCRGlyKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9BRERTVFJJTkcxNjogcmV0dXJuIExCQWRkU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9JTlNFUlRTVFJJTkcxNjogcmV0dXJuIExCSW5zZXJ0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9ERUxFVEVTVFJJTkcxNjogcmV0dXJuIExCRGVsZXRlU3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9GSU5EU1RSSU5HMTY6IHJldHVybiBMQkZpbmRTdHJpbmcoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0ZJTkRTVFJJTkdFWEFDVDE2OiByZXR1cm4gTEJGaW5kU3RyaW5nRXhhY3QoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVENBUkVUSU5ERVgxNjogcmV0dXJuIExCR2V0Q2FyZXRJbmRleChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfR0VUQ09VTlQxNjogcmV0dXJuIExCR2V0Q291bnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVENVUlNFTDE2OiByZXR1cm4gTEJHZXRDdXJTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVEhPUklaT05UQUxFWFRFTlQxNjogcmV0dXJuIExCR2V0SG9yaXpvbnRhbEV4dGVudChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfR0VUSVRFTURBVEExNjogcmV0dXJuIExCR2V0SXRlbURhdGEoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVElURU1IRUlHSFQxNjogcmV0dXJuIExCR2V0SXRlbUhlaWdodChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfR0VUSVRFTVJFQ1QxNjogcmV0dXJuIExCR2V0SXRlbVJlY3QoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVFNFTDE2OiByZXR1cm4gTEJHZXRTZWwoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVFNFTENPVU5UMTY6IHJldHVybiBMQkdldFNlbENvdW50KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9HRVRTRUxJVEVNUzE2OiByZXR1cm4gTEJHZXRTZWxJdGVtcyhod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfR0VUVEVYVDE2OiByZXR1cm4gTEJHZXRUZXh0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9HRVRURVhUTEVOMTY6IHJldHVybiBMQkdldFRleHRMZW4oaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX0dFVFRPUElOREVYMTY6IHJldHVybiBMQkdldFRvcEluZGV4KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9TRUxFQ1RTVFJJTkcxNjogcmV0dXJuIExCU2VsZWN0U3RyaW5nKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0UxNjogcmV0dXJuIExCU2VsSXRlbVJhbmdlKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9TRVRDQVJFVElOREVYMTY6IHJldHVybiBMQlNldENhcmV0SW5kZXgoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX1NFVENPTFVNTldJRFRIMTY6IHJldHVybiBMQlNldENvbHVtbldpZHRoKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9TRVRIT1JJWk9OVEFMRVhURU5UMTY6IHJldHVybiBMQlNldEhvcml6b250YWxFeHRlbnQoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX1NFVElURU1EQVRBMTY6IHJldHVybiBMQlNldEl0ZW1EYXRhKGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgY2FzZSBMQl9TRVRUQUJTVE9QUzE2OiByZXR1cm4gTEJTZXRUYWJTdG9wcyhod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfU0VUQ1VSU0VMMTY6IHJldHVybiBMQlNldEN1clNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfU0VUU0VMMTY6IHJldHVybiBMQlNldFNlbChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgIGNhc2UgTEJfU0VUVE9QSU5ERVgxNjogcmV0dXJuIExCU2V0VG9wSW5kZXgoaHduZCwgd1BhcmFtLCBsUGFyYW0pOwotICAgICBjYXNlIExCX1NFVElURU1IRUlHSFQxNjogcmV0dXJuIExCU2V0SXRlbUhlaWdodChod25kLCB3UGFyYW0sIGxQYXJhbSk7Ci0KLSAgICAgY2FzZSBXTV9EUk9QRklMRVM6IHJldHVybiBMQlBhc3NUb1BhcmVudChod25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci0KLSAgICAgLyogdGhlc2Ugd2lsbCBoYXZlIHRvIGJlIGltcGxlbWVudGVkIGZvciBwcm9wZXIgTEJTX0VYVEVOREVEU0VMIC0KLSAgICAgICoKLSAgICAgICogYW5jaG9yIGl0ZW0gaXMgYW4gaXRlbSB0aGF0IHdpdGggY2FyZXQgKGZvY3VzZWQpIGl0ZW0gZGVmaW5lcyBhIAotICAgICAgKiByYW5nZSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMgd2hlbiBsaXN0Ym94IGlzIGluIHRoZSBleHRlbmRlZCAKLSAgICAgICogc2VsZWN0aW9uIG1vZGUuCi0gICAgICAqLwotICAgICBjYXNlIExCX1NFVEFOQ0hPUklOREVYMTY6IHJldHVybiBMQl9TRVRBTkNIT1JJTkRFWDE2OyAvKiB0aGF0J3Mgd2hhdCBXaW5kb3dzIHJldHVybnMgKi8KLSAgICAgY2FzZSBMQl9HRVRBTkNIT1JJTkRFWDE2OiByZXR1cm4gMDsKLQotCWNhc2UgV01fRFJPUE9CSkVDVDoKLQljYXNlIFdNX1FVRVJZRFJPUE9CSkVDVDoKLQljYXNlIFdNX0RSQUdTRUxFQ1Q6Ci0JY2FzZSBXTV9EUkFHTU9WRToKLQkgICAgICAgIHsKLQkJIExQRFJBR0lORk8gbHBEcmFnSW5mbyA9IChMUERSQUdJTkZPKSBQVFJfU0VHX1RPX0xJTigoU0VHUFRSKWxQYXJhbSk7Ci0JCSBMUEhFQURMSVNUIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKLQotCQkgbHBEcmFnSW5mby0+bCA9IExpc3RCb3hGaW5kTW91c2UobHBobCxscERyYWdJbmZvLT5wdC54LAotCQkJCQkJICAgICAgIGxwRHJhZ0luZm8tPnB0LnkpOwotCSAgICAgICAgCi0JCSByZXR1cm4gTEJQYXNzVG9QYXJlbnQoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotCQl9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgRGxnRGlyTGlzdCAgICAoVVNFUi4xMDApCi0gKi8KLUlOVCBEbGdEaXJMaXN0KCBIV05EIGhEbGcsIFNFR1BUUiBzcGVjLCBJTlQgaWRMQm94LCBJTlQgaWRTdGF0aWMsIFVJTlQgYXR0cmliICkKLXsKLSAgICBjaGFyICpmaWxlc3BlYyA9IChjaGFyICopUFRSX1NFR19UT19MSU4oIHNwZWMgKTsKLSAgICBpbnQgZHJpdmU7Ci0gICAgSFdORCBod25kOwotCi0jZGVmaW5lIFNFTkRNU0cobXNnLHdwYXJhbSxscGFyYW0pIFwKLSAgICAoKGF0dHJpYiAmIERETF9QT1NUTVNHUykgPyBQb3N0TWVzc2FnZSggaHduZCwgbXNnLCB3cGFyYW0sIGxwYXJhbSApIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW5kTWVzc2FnZTE2KCBod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtICkpCi0KLSAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkRsZ0Rpckxpc3Q6ICUwNHggJyVzJyAlZCAlZCAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgaERsZywgZmlsZXNwZWMgPyBmaWxlc3BlYyA6ICJOVUxMIiwKLSAgICAgICAgICAgICAgICAgICAgIGlkTEJveCwgaWRTdGF0aWMsIGF0dHJpYiApOwotCi0gICAgaWYgKGZpbGVzcGVjICYmIGZpbGVzcGVjWzBdICYmIChmaWxlc3BlY1sxXSA9PSAnOicpKQotICAgIHsKLSAgICAgICAgZHJpdmUgPSB0b3VwcGVyKCBmaWxlc3BlY1swXSApIC0gJ0EnOwotICAgICAgICBmaWxlc3BlYyArPSAyOwotICAgICAgICBpZiAoIURSSVZFX1NldEN1cnJlbnREcml2ZSggZHJpdmUgKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7Ci0KLSAgICBpZiAoaWRMQm94ICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkTEJveCApKSAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGNoYXIgbWFza1syMF07Ci0gICAgICAgIAotICAgICAgICBpZiAoIWZpbGVzcGVjIHx8ICFmaWxlc3BlY1swXSkgc3RyY3B5KCBtYXNrLCAiKi4qIiApOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIHRoZSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnksIGNoZGlyIHRvIGl0ICovCi0gICAgICAgICAgICBpZiAoRFJJVkVfQ2hkaXIoIGRyaXZlLCBmaWxlc3BlYyApKSBzdHJjcHkoIG1hc2ssICIqLioiICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciAqcCwgKnAyOwotICAgICAgICAgICAgICAgIHAgPSBmaWxlc3BlYzsKLSAgICAgICAgICAgICAgICBpZiAoKHAyID0gc3RycmNociggcCwgJ1xcJyApKSkgcCA9IHAyICsgMTsKLSAgICAgICAgICAgICAgICBpZiAoKHAyID0gc3RycmNociggcCwgJy8nICkpKSBwID0gcDIgKyAxOwotICAgICAgICAgICAgICAgIGxzdHJjcHluMzJBKCBtYXNrLCBwLCBzaXplb2YobWFzaykgKTsKLSAgICAgICAgICAgICAgICBpZiAocCAhPSBmaWxlc3BlYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBbLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFEUklWRV9DaGRpciggZHJpdmUsIGZpbGVzcGVjICkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN0cmNweSggKGNoYXIgKilQVFJfU0VHX1RPX0xJTihzcGVjKSwgbWFzayApOwotCi0gICAgICAgIGRwcmludGZfbGlzdGJveChzdGRkZWIsICJMaXN0Qm94RGlyZWN0b3J5OiBwYXRoPSVjOlxcJXMgbWFzaz0lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICdBJyArIGRyaXZlLCBEUklWRV9HZXREb3NDd2QoZHJpdmUpLCBtYXNrKTsKLSAgICAgICAgCi0gICAgICAgIFNFTkRNU0coIExCX1JFU0VUQ09OVEVOVDE2LCAwLCAwICk7Ci0gICAgICAgIGlmICgoYXR0cmliICYgRERMX0RJUkVDVE9SWSkgJiYgIShhdHRyaWIgJiBERExfRVhDTFVTSVZFKSkKLSAgICAgICAgewotICAgICAgICAgICAgY2hhciAqdGVtcDsKLSAgICAgICAgICAgIGlmIChTRU5ETVNHKCBMQl9ESVIxNiwgYXR0cmliICYgfihERExfRElSRUNUT1JZIHwgRERMX0RSSVZFUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlzcGVjICkgPT0gTEJfRVJSKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoISh0ZW1wID0gU0VHUFRSX0FMTE9DKCA0KnNpemVvZihjaGFyKSApKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgc3RyY3B5KCB0ZW1wLCAiKi4qIiApOwotICAgICAgICAgICAgLyogRklYTUU6IHRoaXMgd29uJ3Qgd29yayB3aXRoIFBvc3RNZXNzYWdlKCksIGFzIHRlbXAgd2lsbCAqLwotICAgICAgICAgICAgLyogaGF2ZSBiZWVuIGZyZWVkIGJ5IHRoZSB0aW1lIHdlIGRvIGEgRGlzcGF0Y2hNZXNzYWdlKCkuICAqLwotICAgICAgICAgICAgaWYgKFNFTkRNU0coIExCX0RJUjE2LCAoYXR0cmliICYgKERETF9ESVJFQ1RPUlkgfCBERExfRFJJVkVTKSkgfCBERExfRVhDTFVTSVZFLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pU0VHUFRSX0dFVCh0ZW1wKSApID09IExCX0VSUikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTRUdQVFJfRlJFRSh0ZW1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTRUdQVFJfRlJFRSh0ZW1wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTRU5ETVNHKCBMQl9ESVIxNiwgYXR0cmliLCAoTFBBUkFNKXNwZWMpID09IExCX0VSUikgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGlkU3RhdGljICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkU3RhdGljICkpICE9IDApKQotICAgIHsKLSAgICAgICAgY2hhciB0ZW1wWzUxMl07Ci0gICAgICAgIGludCBkcml2ZSA9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOwotICAgICAgICBzdHJjcHkoIHRlbXAsICJBOlxcIiApOwotICAgICAgICB0ZW1wWzBdICs9IGRyaXZlOwotICAgICAgICBsc3RyY3B5bjMyQSggdGVtcCArIDMsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIHNpemVvZih0ZW1wKS0zICk7Ci0gICAgICAgIEFuc2lMb3dlciggdGVtcCApOwotICAgICAgICAvKiBDYW4ndCB1c2UgUG9zdE1lc3NhZ2UoKSBoZXJlLCBiZWNhdXNlIHRoZSBzdHJpbmcgaXMgb24gdGhlIHN0YWNrICovCi0gICAgICAgIFNldERsZ0l0ZW1UZXh0MzJBKCBoRGxnLCBpZFN0YXRpYywgdGVtcCApOwotICAgIH0KKyAgICBMSVNUQk9YX1Jlc2V0Q29udGVudCggd25kLCBkZXNjciApOworICAgIEhlYXBEZXN0cm95KCBkZXNjci0+aGVhcCApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXNjciApOworICAgICooTEJfREVTQ1IgKiopd25kLT53RXh0cmEgPSBOVUxMOwogICAgIHJldHVybiBUUlVFOwotI3VuZGVmIFNFTkRNU0cKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBMaXN0Qm94V25kUHJvYworICovCitMUkVTVUxUIExpc3RCb3hXbmRQcm9jKEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgTFJFU1VMVCByZXQ7CisgICAgTEJfREVTQ1IgKmRlc2NyOworICAgIFdORCAqd25kID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKworICAgIGlmICghd25kKSByZXR1cm4gMDsKKyAgICBpZiAoIShkZXNjciA9ICooTEJfREVTQ1IgKiopd25kLT53RXh0cmEpKQorICAgIHsKKyAgICAgICAgaWYgKG1zZyA9PSBXTV9DUkVBVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghTElTVEJPWF9DcmVhdGUoIHduZCApKSByZXR1cm4gLTE7CisgICAgICAgICAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3g6IGNyZWF0aW5nIHduZD0lMDR4IGRlc2NyPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kLCAqKExCX0RFU0NSICoqKXduZC0+d0V4dHJhICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBJZ25vcmUgYWxsIG90aGVyIG1lc3NhZ2VzIGJlZm9yZSB3ZSBnZXQgYSBXTV9DUkVBVEUgKi8KKyAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MzMkEoIGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICB9CisKKyAgICBkcHJpbnRmX2xpc3Rib3goIHN0ZGRlYiwgIkxpc3Rib3ggJTA0eDogbXNnICVzIHdwICUwOHggbHAgJTA4bHhcbiIsCisgICAgICAgICAgICAgICAgICAgICB3bmQtPmh3bmRTZWxmLCBTUFlfR2V0TXNnTmFtZShtc2cpLCB3UGFyYW0sIGxQYXJhbSApOworICAgIHN3aXRjaChtc2cpCisgICAgeworICAgIGNhc2UgTEJfUkVTRVRDT05URU5UMTY6CisgICAgY2FzZSBMQl9SRVNFVENPTlRFTlQzMjoKKyAgICAgICAgTElTVEJPWF9SZXNldENvbnRlbnQoIHduZCwgZGVzY3IgKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIExCX0FERFNUUklORzE2OgorICAgICAgICBpZiAoSEFTX1NUUklOR1MoZGVzY3IpKSBsUGFyYW0gPSAoTFBBUkFNKVBUUl9TRUdfVE9fTElOKGxQYXJhbSk7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTEJfQUREU1RSSU5HMzI6CisgICAgICAgIHdQYXJhbSA9IExJU1RCT1hfRmluZFN0cmluZ1Bvcyggd25kLCBkZXNjciwgKExQQ1NUUilsUGFyYW0sIEZBTFNFICk7CisgICAgICAgIHJldHVybiBMSVNUQk9YX0luc2VydFN0cmluZyggd25kLCBkZXNjciwgd1BhcmFtLCAoTFBDU1RSKWxQYXJhbSApOworCisgICAgY2FzZSBMQl9JTlNFUlRTVFJJTkcxNjoKKyAgICAgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSkgbFBhcmFtID0gKExQQVJBTSlQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICB3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBMQl9JTlNFUlRTVFJJTkczMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfSW5zZXJ0U3RyaW5nKCB3bmQsIGRlc2NyLCB3UGFyYW0sIChMUENTVFIpbFBhcmFtICk7CisKKyAgICBjYXNlIExCX0FEREZJTEUxNjoKKyAgICAgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSkgbFBhcmFtID0gKExQQVJBTSlQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX0FEREZJTEUzMjoKKyAgICAgICAgd1BhcmFtID0gTElTVEJPWF9GaW5kRmlsZVN0clBvcyggd25kLCBkZXNjciwgKExQQ1NUUilsUGFyYW0gKTsKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfSW5zZXJ0U3RyaW5nKCB3bmQsIGRlc2NyLCB3UGFyYW0sIChMUENTVFIpbFBhcmFtICk7CisKKyAgICBjYXNlIExCX0RFTEVURVNUUklORzE2OgorICAgIGNhc2UgTEJfREVMRVRFU1RSSU5HMzI6CisgICAgICAgIHJldHVybiBMSVNUQk9YX1JlbW92ZUl0ZW0oIHduZCwgZGVzY3IsIHdQYXJhbSApOworCisgICAgY2FzZSBMQl9HRVRJVEVNREFUQTE2OgorICAgIGNhc2UgTEJfR0VUSVRFTURBVEEzMjoKKyAgICAgICAgaWYgKCgoSU5UMzIpd1BhcmFtIDwgMCkgfHwgKChJTlQzMil3UGFyYW0gPj0gZGVzY3ItPm5iX2l0ZW1zKSkKKyAgICAgICAgICAgIHJldHVybiBMQl9FUlI7CisgICAgICAgIHJldHVybiBkZXNjci0+aXRlbXNbd1BhcmFtXS5kYXRhOworCisgICAgY2FzZSBMQl9TRVRJVEVNREFUQTE2OgorICAgIGNhc2UgTEJfU0VUSVRFTURBVEEzMjoKKyAgICAgICAgaWYgKCgoSU5UMzIpd1BhcmFtIDwgMCkgfHwgKChJTlQzMil3UGFyYW0gPj0gZGVzY3ItPm5iX2l0ZW1zKSkKKyAgICAgICAgICAgIHJldHVybiBMQl9FUlI7CisgICAgICAgIGRlc2NyLT5pdGVtc1t3UGFyYW1dLmRhdGEgPSAoRFdPUkQpbFBhcmFtOworICAgICAgICByZXR1cm4gTEJfT0tBWTsKKworICAgIGNhc2UgTEJfR0VUQ09VTlQxNjoKKyAgICBjYXNlIExCX0dFVENPVU5UMzI6CisgICAgICAgIHJldHVybiBkZXNjci0+bmJfaXRlbXM7CisKKyAgICBjYXNlIExCX0dFVFRFWFQxNjoKKyAgICAgICAgbFBhcmFtID0gKExQQVJBTSlQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX0dFVFRFWFQzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfR2V0VGV4dCggd25kLCBkZXNjciwgd1BhcmFtLCAoTFBTVFIpbFBhcmFtICk7CisKKyAgICBjYXNlIExCX0dFVFRFWFRMRU4xNjoKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBMQl9HRVRURVhUTEVOMzI6CisgICAgICAgIGlmICh3UGFyYW0gPj0gZGVzY3ItPm5iX2l0ZW1zKSByZXR1cm4gTEJfRVJSOworICAgICAgICByZXR1cm4gKEhBU19TVFJJTkdTKGRlc2NyKSA/IHN0cmxlbihkZXNjci0+aXRlbXNbd1BhcmFtXS5zdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2l6ZW9mKERXT1JEKSk7CisKKyAgICBjYXNlIExCX0dFVENVUlNFTDE2OgorICAgIGNhc2UgTEJfR0VUQ1VSU0VMMzI6CisgICAgICAgIHJldHVybiBkZXNjci0+c2VsZWN0ZWRfaXRlbTsKKworICAgIGNhc2UgTEJfR0VUVE9QSU5ERVgxNjoKKyAgICBjYXNlIExCX0dFVFRPUElOREVYMzI6CisgICAgICAgIHJldHVybiBkZXNjci0+dG9wX2l0ZW07CisKKyAgICBjYXNlIExCX0dFVElURU1IRUlHSFQxNjoKKyAgICBjYXNlIExCX0dFVElURU1IRUlHSFQzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfR2V0SXRlbUhlaWdodCggd25kLCBkZXNjciwgd1BhcmFtICk7CisKKyAgICBjYXNlIExCX1NFVElURU1IRUlHSFQxNjoKKyAgICAgICAgbFBhcmFtID0gTE9XT1JEKGxQYXJhbSk7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTEJfU0VUSVRFTUhFSUdIVDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRJdGVtSGVpZ2h0KCB3bmQsIGRlc2NyLCB3UGFyYW0sIGxQYXJhbSApOworCisgICAgY2FzZSBMQl9JVEVNRlJPTVBPSU5UMzI6CisgICAgICAgIHsKKyAgICAgICAgICAgIFBPSU5UMzIgcHQgPSB7IExPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSB9OworICAgICAgICAgICAgUkVDVDMyIHJlY3QgPSB7IDAsIDAsIGRlc2NyLT53aWR0aCwgZGVzY3ItPmhlaWdodCB9OworICAgICAgICAgICAgcmV0dXJuIE1BS0VMT05HKCBMSVNUQk9YX0dldEl0ZW1Gcm9tUG9pbnQod25kLCBkZXNjciwgcHQueCwgcHQueSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0SW5SZWN0MzIoICZyZWN0LCBwdCApICk7CisgICAgICAgIH0KKworICAgIGNhc2UgTEJfU0VUQ0FSRVRJTkRFWDE2OgorICAgIGNhc2UgTEJfU0VUQ0FSRVRJTkRFWDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRDYXJldEluZGV4KCB3bmQsIGRlc2NyLCB3UGFyYW0sICFsUGFyYW0gKTsKKworICAgIGNhc2UgTEJfR0VUQ0FSRVRJTkRFWDE2OgorICAgIGNhc2UgTEJfR0VUQ0FSRVRJTkRFWDMyOgorICAgICAgICByZXR1cm4gZGVzY3ItPmZvY3VzX2l0ZW07CisKKyAgICBjYXNlIExCX1NFVFRPUElOREVYMTY6CisgICAgY2FzZSBMQl9TRVRUT1BJTkRFWDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRUb3BJdGVtKCB3bmQsIGRlc2NyLCB3UGFyYW0sIFRSVUUgKTsKKworICAgIGNhc2UgTEJfU0VUQ09MVU1OV0lEVEgxNjoKKyAgICBjYXNlIExCX1NFVENPTFVNTldJRFRIMzI6CisgICAgICAgIHJldHVybiBMSVNUQk9YX1NldENvbHVtbldpZHRoKCB3bmQsIGRlc2NyLCB3UGFyYW0gKTsKKworICAgIGNhc2UgTEJfR0VUSVRFTVJFQ1QxNjoKKyAgICAgICAgeworICAgICAgICAgICAgUkVDVDMyIHJlY3Q7CisgICAgICAgICAgICByZXQgPSBMSVNUQk9YX0dldEl0ZW1SZWN0KCB3bmQsIGRlc2NyLCAoSU5UMTYpd1BhcmFtLCAmcmVjdCApOworICAgICAgICAgICAgQ09OVl9SRUNUMzJUTzE2KCAmcmVjdCwgKFJFQ1QxNiAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY2FzZSBMQl9HRVRJVEVNUkVDVDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9HZXRJdGVtUmVjdCggd25kLCBkZXNjciwgd1BhcmFtLCAoUkVDVDMyICopbFBhcmFtICk7CisKKyAgICBjYXNlIExCX0ZJTkRTVFJJTkcxNjoKKyAgICAgICAgd1BhcmFtID0gKElOVDMyKShJTlQxNil3UGFyYW07CisgICAgICAgIGlmIChIQVNfU1RSSU5HUyhkZXNjcikpIGxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBMQl9GSU5EU1RSSU5HMzI6CisgICAgICAgIHJldHVybiBMSVNUQk9YX0ZpbmRTdHJpbmcoIHduZCwgZGVzY3IsIHdQYXJhbSwgKExQQ1NUUilsUGFyYW0sIEZBTFNFICk7CisKKyAgICBjYXNlIExCX0ZJTkRTVFJJTkdFWEFDVDE2OgorICAgICAgICB3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKyAgICAgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSkgbFBhcmFtID0gKExQQVJBTSlQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX0ZJTkRTVFJJTkdFWEFDVDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9GaW5kU3RyaW5nKCB3bmQsIGRlc2NyLCB3UGFyYW0sIChMUENTVFIpbFBhcmFtLCBUUlVFICk7CisKKyAgICBjYXNlIExCX1NFTEVDVFNUUklORzE2OgorICAgICAgICB3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKyAgICAgICAgaWYgKEhBU19TVFJJTkdTKGRlc2NyKSkgbFBhcmFtID0gKExQQVJBTSlQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX1NFTEVDVFNUUklORzMyOgorICAgICAgICB7CisgICAgICAgICAgICBJTlQzMiBpbmRleCA9IExJU1RCT1hfRmluZFN0cmluZyggd25kLCBkZXNjciwgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUENTVFIpbFBhcmFtLCBGQUxTRSApOworICAgICAgICAgICAgaWYgKGluZGV4ID09IExCX0VSUikgcmV0dXJuIExCX0VSUjsKKyAgICAgICAgICAgIExJU1RCT1hfU2V0U2VsZWN0aW9uKCB3bmQsIGRlc2NyLCBpbmRleCwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkgIT0gMCApOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICBjYXNlIExCX0dFVFNFTDE2OgorICAgICAgICB3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBMQl9HRVRTRUwzMjoKKyAgICAgICAgaWYgKCgoSU5UMzIpd1BhcmFtIDwgMCkgfHwgKChJTlQzMil3UGFyYW0gPj0gZGVzY3ItPm5iX2l0ZW1zKSkKKyAgICAgICAgICAgIHJldHVybiBMQl9FUlI7CisgICAgICAgIHJldHVybiBkZXNjci0+aXRlbXNbd1BhcmFtXS5zZWxlY3RlZDsKKworICAgIGNhc2UgTEJfU0VUU0VMMTY6CisgICAgICAgIGxQYXJhbSA9IChJTlQzMikoSU5UMTYpbFBhcmFtOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX1NFVFNFTDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRTZWxlY3Rpb24oIHduZCwgZGVzY3IsIGxQYXJhbSwgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjci0+c3R5bGUgJiBMQlNfTk9USUZZKSAhPSAwICk7CisKKyAgICBjYXNlIExCX1NFVENVUlNFTDE2OgorICAgICAgICB3UGFyYW0gPSAoSU5UMzIpKElOVDE2KXdQYXJhbTsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBMQl9TRVRDVVJTRUwzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfU2V0U2VsZWN0aW9uKCB3bmQsIGRlc2NyLCB3UGFyYW0sIFRSVUUsIEZBTFNFICk7CisKKyAgICBjYXNlIExCX0dFVFNFTENPVU5UMTY6CisgICAgY2FzZSBMQl9HRVRTRUxDT1VOVDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9HZXRTZWxDb3VudCggd25kLCBkZXNjciApOworCisgICAgY2FzZSBMQl9HRVRTRUxJVEVNUzE2OgorICAgICAgICByZXR1cm4gTElTVEJPWF9HZXRTZWxJdGVtczE2KCB3bmQsIGRlc2NyLCB3UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUElOVDE2KVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKKworICAgIGNhc2UgTEJfR0VUU0VMSVRFTVMzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfR2V0U2VsSXRlbXMzMiggd25kLCBkZXNjciwgd1BhcmFtLCAoTFBJTlQzMilsUGFyYW0gKTsKKworICAgIGNhc2UgTEJfU0VMSVRFTVJBTkdFMTY6CisgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0UzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfU2VsZWN0SXRlbVJhbmdlKCB3bmQsIGRlc2NyLCBMT1dPUkQobFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISVdPUkQobFBhcmFtKSwgd1BhcmFtICk7CisKKyAgICBjYXNlIExCX1NFTElURU1SQU5HRUVYMTY6CisgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0VFWDMyOgorICAgICAgICBpZiAoKElOVDMyKWxQYXJhbSA+PSAoSU5UMzIpd1BhcmFtKQorICAgICAgICAgICAgcmV0dXJuIExJU1RCT1hfU2VsZWN0SXRlbVJhbmdlKCB3bmQsIGRlc2NyLCB3UGFyYW0sIGxQYXJhbSwgVFJVRSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTElTVEJPWF9TZWxlY3RJdGVtUmFuZ2UoIHduZCwgZGVzY3IsIGxQYXJhbSwgd1BhcmFtLCBGQUxTRSk7CisKKyAgICBjYXNlIExCX0dFVEhPUklaT05UQUxFWFRFTlQxNjoKKyAgICBjYXNlIExCX0dFVEhPUklaT05UQUxFWFRFTlQzMjoKKyAgICAgICAgcmV0dXJuIGRlc2NyLT5ob3J6X2V4dGVudDsKKworICAgIGNhc2UgTEJfU0VUSE9SSVpPTlRBTEVYVEVOVDE2OgorICAgIGNhc2UgTEJfU0VUSE9SSVpPTlRBTEVYVEVOVDMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRIb3Jpem9udGFsRXh0ZW50KCB3bmQsIGRlc2NyLCB3UGFyYW0gKTsKKworICAgIGNhc2UgTEJfR0VUQU5DSE9SSU5ERVgxNjoKKyAgICBjYXNlIExCX0dFVEFOQ0hPUklOREVYMzI6CisgICAgICAgIHJldHVybiBkZXNjci0+YW5jaG9yX2l0ZW07CisKKyAgICBjYXNlIExCX1NFVEFOQ0hPUklOREVYMTY6CisgICAgICAgIHdQYXJhbSA9IChJTlQzMikoSU5UMTYpd1BhcmFtOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIExCX1NFVEFOQ0hPUklOREVYMzI6CisgICAgICAgIGlmICgoKElOVDMyKXdQYXJhbSA8IC0xKSB8fCAoKElOVDMyKXdQYXJhbSA+PSBkZXNjci0+bmJfaXRlbXMpKQorICAgICAgICAgICAgcmV0dXJuIExCX0VSUjsKKyAgICAgICAgZGVzY3ItPmFuY2hvcl9pdGVtID0gKElOVDMyKXdQYXJhbTsKKyAgICAgICAgcmV0dXJuIExCX09LQVk7CisKKyAgICBjYXNlIExCX0RJUjE2OgorICAgICAgICByZXR1cm4gTElTVEJPWF9EaXJlY3RvcnkoIHduZCwgZGVzY3IsIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIEZBTFNFICk7CisKKyAgICBjYXNlIExCX0RJUjMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9EaXJlY3RvcnkoIHduZCwgZGVzY3IsIHdQYXJhbSwgKExQQ1NUUilsUGFyYW0sIFRSVUUgKTsKKworICAgIGNhc2UgTEJfR0VUTE9DQUxFMzI6CisgICAgICAgIHJldHVybiBkZXNjci0+bG9jYWxlOworCisgICAgY2FzZSBMQl9TRVRMT0NBTEUzMjoKKyAgICAgICAgZGVzY3ItPmxvY2FsZSA9IChMQ0lEKXdQYXJhbTsgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgZm9yIHZhbGlkIGxjaWQgKi8KKyAgICAgICAgcmV0dXJuIExCX09LQVk7CisKKyAgICBjYXNlIExCX0lOSVRTVE9SQUdFMzI6CisgICAgICAgIHJldHVybiBMSVNUQk9YX0luaXRTdG9yYWdlKCB3bmQsIGRlc2NyLCB3UGFyYW0sIChEV09SRClsUGFyYW0gKTsKKworICAgIGNhc2UgTEJfU0VUQ09VTlQzMjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfU2V0Q291bnQoIHduZCwgZGVzY3IsIChJTlQzMil3UGFyYW0gKTsKKworICAgIGNhc2UgTEJfU0VUVEFCU1RPUFMxNjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfU2V0VGFiU3RvcHMoIHduZCwgZGVzY3IsIChJTlQzMikoSU5UMTYpd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQSU5UMzIpUFRSX1NFR19UT19MSU4obFBhcmFtKSwgVFJVRSApOworCisgICAgY2FzZSBMQl9TRVRUQUJTVE9QUzMyOgorICAgICAgICByZXR1cm4gTElTVEJPWF9TZXRUYWJTdG9wcyggd25kLCBkZXNjciwgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQSU5UMzIpbFBhcmFtLCBGQUxTRSApOworCisgICAgY2FzZSBMQl9DQVJFVE9OMTY6CisgICAgY2FzZSBMQl9DQVJFVE9OMzI6CisgICAgICAgIGlmIChkZXNjci0+Y2FyZXRfb24pIHJldHVybiBMQl9PS0FZOworICAgICAgICBkZXNjci0+Y2FyZXRfb24gPSBUUlVFOworICAgICAgICBpZiAoKGRlc2NyLT5mb2N1c19pdGVtICE9IC0xKSAmJiAoR2V0Rm9jdXMzMigpID09IHduZC0+aHduZFNlbGYpKQorICAgICAgICAgICAgTElTVEJPWF9SZXBhaW50SXRlbSggd25kLCBkZXNjciwgZGVzY3ItPmZvY3VzX2l0ZW0sIE9EQV9GT0NVUyApOworICAgICAgICByZXR1cm4gTEJfT0tBWTsKKworICAgIGNhc2UgTEJfQ0FSRVRPRkYxNjoKKyAgICBjYXNlIExCX0NBUkVUT0ZGMzI6CisgICAgICAgIGlmICghZGVzY3ItPmNhcmV0X29uKSByZXR1cm4gTEJfT0tBWTsKKyAgICAgICAgZGVzY3ItPmNhcmV0X29uID0gRkFMU0U7CisgICAgICAgIGlmICgoZGVzY3ItPmZvY3VzX2l0ZW0gIT0gLTEpICYmIChHZXRGb2N1czMyKCkgPT0gd25kLT5od25kU2VsZikpCisgICAgICAgICAgICBMSVNUQk9YX1JlcGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+Zm9jdXNfaXRlbSwgT0RBX0ZPQ1VTICk7CisgICAgICAgIHJldHVybiBMQl9PS0FZOworCisgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICByZXR1cm4gTElTVEJPWF9EZXN0cm95KCB3bmQsIGRlc2NyICk7CisKKyAgICBjYXNlIFdNX0VOQUJMRToKKyAgICAgICAgSW52YWxpZGF0ZVJlY3QzMiggaHduZCwgTlVMTCwgVFJVRSApOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fU0VUUkVEUkFXOgorICAgICAgICBMSVNUQk9YX1NldFJlZHJhdyggd25kLCBkZXNjciwgd1BhcmFtICE9IDAgKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0dFVERMR0NPREU6CisgICAgICAgIHJldHVybiBETEdDX1dBTlRBUlJPV1MgfCBETEdDX1dBTlRDSEFSUzsKKworICAgIGNhc2UgV01fUEFJTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFBBSU5UU1RSVUNUMzIgcHM7CisgICAgICAgICAgICBIREMzMiBoZGMgPSBCZWdpblBhaW50MzIoIGh3bmQsICZwcyApOworICAgICAgICAgICAgcmV0ID0gTElTVEJPWF9QYWludCggd25kLCBkZXNjciwgaGRjICk7CisgICAgICAgICAgICBFbmRQYWludDMyKCBod25kLCAmcHMgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY2FzZSBXTV9TSVpFOgorICAgICAgICBMSVNUQk9YX1VwZGF0ZVNpemUoIHduZCwgZGVzY3IgKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0dFVEZPTlQ6CisgICAgICAgIHJldHVybiBkZXNjci0+Zm9udDsKKworICAgIGNhc2UgV01fU0VURk9OVDoKKyAgICAgICAgTElTVEJPWF9TZXRGb250KCB3bmQsIGRlc2NyLCAoSEZPTlQzMil3UGFyYW0gKTsKKyAgICAgICAgaWYgKGxQYXJhbSkgSW52YWxpZGF0ZVJlY3QzMiggd25kLT5od25kU2VsZiwgMCwgVFJVRSApOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fU0VURk9DVVM6CisgICAgICAgIGRlc2NyLT5jYXJldF9vbiA9IFRSVUU7CisgICAgICAgIGlmIChkZXNjci0+Zm9jdXNfaXRlbSAhPSAtMSkKKyAgICAgICAgICAgIExJU1RCT1hfUmVwYWludEl0ZW0oIHduZCwgZGVzY3IsIGRlc2NyLT5mb2N1c19pdGVtLCBPREFfRk9DVVMgKTsKKyAgICAgICAgU0VORF9OT1RJRklDQVRJT04oIHduZCwgZGVzY3IsIExCTl9TRVRGT0NVUyApOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgV01fS0lMTEZPQ1VTOgorICAgICAgICBpZiAoKGRlc2NyLT5mb2N1c19pdGVtICE9IC0xKSAmJiBkZXNjci0+Y2FyZXRfb24pCisgICAgICAgICAgICBMSVNUQk9YX1JlcGFpbnRJdGVtKCB3bmQsIGRlc2NyLCBkZXNjci0+Zm9jdXNfaXRlbSwgT0RBX0ZPQ1VTICk7CisgICAgICAgIFNFTkRfTk9USUZJQ0FUSU9OKCB3bmQsIGRlc2NyLCBMQk5fS0lMTEZPQ1VTICk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9IU0NST0xMOgorICAgICAgICByZXR1cm4gTElTVEJPWF9IYW5kbGVIU2Nyb2xsKCB3bmQsIGRlc2NyLCB3UGFyYW0sIGxQYXJhbSApOworCisgICAgY2FzZSBXTV9WU0NST0xMOgorICAgICAgICByZXR1cm4gTElTVEJPWF9IYW5kbGVWU2Nyb2xsKCB3bmQsIGRlc2NyLCB3UGFyYW0sIGxQYXJhbSApOworCisgICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfSGFuZGxlTEJ1dHRvbkRvd24oIHduZCwgZGVzY3IsIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQxNilMT1dPUkQobFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQxNilISVdPUkQobFBhcmFtKSApOworCisgICAgY2FzZSBXTV9MQlVUVE9OREJMQ0xLOgorICAgICAgICBpZiAoZGVzY3ItPnN0eWxlICYgTEJTX05PVElGWSkKKyAgICAgICAgICAgIFNFTkRfTk9USUZJQ0FUSU9OKCB3bmQsIGRlc2NyLCBMQk5fREJMQ0xLICk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9NT1VTRU1PVkU6CisgICAgICAgIGlmIChHZXRDYXB0dXJlMzIoKSA9PSBod25kKQorICAgICAgICAgICAgTElTVEJPWF9IYW5kbGVNb3VzZU1vdmUoIHduZCwgZGVzY3IsIChJTlQxNilMT1dPUkQobFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UMTYpSElXT1JEKGxQYXJhbSkgKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFdNX0xCVVRUT05VUDoKKyAgICAgICAgaWYgKExJU1RCT1hfVGltZXIgIT0gTEJfVElNRVJfTk9ORSkKKyAgICAgICAgICAgIEtpbGxTeXN0ZW1UaW1lcjMyKCBod25kLCBMQl9USU1FUl9JRCApOworICAgICAgICBMSVNUQk9YX1RpbWVyID0gTEJfVElNRVJfTk9ORTsKKyAgICAgICAgaWYgKEdldENhcHR1cmUzMigpID09IGh3bmQpIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBXTV9LRVlET1dOOgorICAgICAgICByZXR1cm4gTElTVEJPWF9IYW5kbGVLZXlEb3duKCB3bmQsIGRlc2NyLCB3UGFyYW0gKTsKKworICAgIGNhc2UgV01fQ0hBUjoKKyAgICAgICAgcmV0dXJuIExJU1RCT1hfSGFuZGxlQ2hhciggd25kLCBkZXNjciwgd1BhcmFtICk7CisKKyAgICBjYXNlIFdNX1NZU1RJTUVSOgorICAgICAgICByZXR1cm4gTElTVEJPWF9IYW5kbGVTeXN0ZW1UaW1lciggd25kLCBkZXNjciApOworCisgICAgY2FzZSBXTV9FUkFTRUJLR05EOgorICAgICAgICBpZiAoSVNfT1dORVJEUkFXKGRlc2NyKSkKKyAgICAgICAgeworICAgICAgICAgICAgUkVDVDMyIHJlY3QgPSB7IDAsIDAsIGRlc2NyLT53aWR0aCwgZGVzY3ItPmhlaWdodCB9OworICAgICAgICAgICAgSEJSVVNIMzIgaGJydXNoID0gU2VuZE1lc3NhZ2UzMkEoIGRlc2NyLT5vd25lciwgV01fQ1RMQ09MT1JMSVNUQk9YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdQYXJhbSwgKExQQVJBTSl3bmQtPmh3bmRTZWxmICk7CisgICAgICAgICAgICBpZiAoaGJydXNoKSBGaWxsUmVjdDMyKCAoSERDMzIpd1BhcmFtLCAmcmVjdCwgaGJydXNoICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIFdNX0RST1BGSUxFUzoKKyAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKworICAgIGNhc2UgV01fRFJPUE9CSkVDVDoKKyAgICBjYXNlIFdNX1FVRVJZRFJPUE9CSkVDVDoKKyAgICBjYXNlIFdNX0RSQUdTRUxFQ1Q6CisgICAgY2FzZSBXTV9EUkFHTU9WRToKKyAgICB7CisgICAgICAgIExQRFJBR0lORk8gZHJhZ0luZm8gPSAoTFBEUkFHSU5GTylQVFJfU0VHX1RPX0xJTiggKFNFR1BUUilsUGFyYW0gKTsKKyAgICAgICAgZHJhZ0luZm8tPmwgPSBMSVNUQk9YX0dldEl0ZW1Gcm9tUG9pbnQoIHduZCwgZGVzY3IsIGRyYWdJbmZvLT5wdC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ0luZm8tPnB0LnkgKTsKKyAgICAgICAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBKCBkZXNjci0+b3duZXIsIG1zZywgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKG1zZyA+PSBXTV9VU0VSKSAmJiAobXNnIDwgMHhjMDAwKSkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJMaXN0Ym94ICUwNHg6IHVua25vd24gbXNnICUwNHggd3AgJTA4eCBscCAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSApOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA1OWNlZTI4Li5mZDViYjhhIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC04NCw4ICs4NCw4IEBACiAjZGVmaW5lIE5PX1NFTEVDVEVEX0lURU0gIDB4ZmZmZgogI2RlZmluZSBTWVNNRU5VX1NFTEVDVEVEICAweGZmZmUgIC8qIE9ubHkgdmFsaWQgb24gbWVudS1iYXJzICovCiAKLSNkZWZpbmUgSVNfU1RSSU5HX0lURU0oZmxhZ3MpICghKChmbGFncykgJiAoTUZfQklUTUFQIHwgTUZfT1dORVJEUkFXIHwgXAotCQkJICAgICBNRl9NRU5VQkFSQlJFQUsgfCBNRl9NRU5VQlJFQUsgfCBNRl9TRVBBUkFUT1IpKSkKKyNkZWZpbmUgSVNfU1RSSU5HX0lURU0oZmxhZ3MpIFwKKyAgICAoISgoZmxhZ3MpICYgKE1GX0JJVE1BUCB8IE1GX09XTkVSRFJBVyB8IE1GX1NFUEFSQVRPUikpKQogCiBleHRlcm4gdm9pZCAgTkNfRHJhd1N5c0J1dHRvbihIV05EIGh3bmQsIEhEQzMyIGhkYywgQk9PTCBkb3duKTsgLypub25jbGllbnQuYyovCiBleHRlcm4gQk9PTCAgTkNfR2V0U3lzUG9wdXBQb3MoV05EKiB3bmRQdHIsIFJFQ1QxNiogcmVjdCk7CkBAIC0xOTIzLDggKzE5MjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG5SZXNlcnZlZCwgSFdORDMyIGhXbmQsIGNvbnN0IFJFQ1QzMiAqbHBSZWN0ICkKIHsKICAgICBSRUNUMTYgcjsKLSAgICBDT05WX1JFQ1QzMlRPMTYoIGxwUmVjdCwgJnIgKTsKLSAgICByZXR1cm4gVHJhY2tQb3B1cE1lbnUxNiggaE1lbnUsIHdGbGFncywgeCwgeSwgblJlc2VydmVkLCBoV25kLCAmciApOworICAgIGlmIChscFJlY3QpCisgICAJIENPTlZfUkVDVDMyVE8xNiggbHBSZWN0LCAmciApOworICAgIHJldHVybiBUcmFja1BvcHVwTWVudTE2KGhNZW51LHdGbGFncyx4LHksblJlc2VydmVkLGhXbmQsbHBSZWN0PyZyOk5VTEwpOwogfQogCiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL29sZGxib3guYyBiL2NvbnRyb2xzL29sZGxib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E3NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJvbHMvb2xkbGJveC5jCkBAIC0wLDAgKzEsODQzIEBACisvKgorICogTGlzdGJveCBjb250cm9scworICogCisgKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKKyAqICAgICAgICAgICAgQ29uc3RhbnRpbmUgU2FwdW50emFraXMsIDE5OTUKKyAqIAkgICAgICBBbGV4IEtvcm9ia2EsIDE5OTUsIDE5OTYgCisgKiAKKyAqLworCisgLyoKKyAgKiBGSVhNRTogCisgICogLSBwcm9wZXIgc2Nyb2xsaW5nIGZvciBtdWx0aWNvbHVtbiBzdHlsZQorICAqIC0gYW5jaG9yIGFuZCBjYXJldCBmb3IgTEJTX0VYVEVOREVEU0VMCisgICogLSBwcm9wZXIgc2VsZWN0aW9uIHdpdGgga2V5Ym9hcmQKKyAgKiAtIGhvdyB0byBoYW5kbGUgKExCU19FWFRFTkRFRFNFTCB8IExCU19NVUxUSVBMRVNFTCkgc3R5bGUKKyAgKiAtIHN1cHBvcnQgZm9yIExCU19OT0lOVEVHUkFMSEVJR0hUIGFuZCBMQlNfT1dORVJEUkFXVkFSSUFCTEUgc3R5bGVzCisgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgIm1zZG9zLmgiCisjaW5jbHVkZSAibGlzdGJveC5oIgorI2luY2x1ZGUgImRvc19mcy5oIgorI2luY2x1ZGUgImRyaXZlLmgiCisjaW5jbHVkZSAiZmlsZS5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorCisjZGVmaW5lIExJU1RfSEVBUF9BTExPQyhscGhsLGYsc2l6ZSkgXAorICAgIExPQ0FMX0FsbG9jKCBscGhsLT5IZWFwU2VsLCBMTUVNX0ZJWEVELCAoc2l6ZSkgKQorI2RlZmluZSBMSVNUX0hFQVBfRlJFRShscGhsLGhhbmRsZSkgXAorICAgIExPQ0FMX0ZyZWUoIGxwaGwtPkhlYXBTZWwsIChoYW5kbGUpICkKKyNkZWZpbmUgTElTVF9IRUFQX0FERFIobHBobCxoYW5kbGUpICBcCisgICAgKChoYW5kbGUpID8gUFRSX1NFR19PRkZfVE9fTElOKGxwaGwtPkhlYXBTZWwsIChoYW5kbGUpKSA6IE5VTEwpCisKKyNkZWZpbmUgTElTVF9IRUFQX1NJWkUgMHgxMDAwMAorCisjZGVmaW5lIExCTU1fRURHRSAgIDQgICAgLyogZGlzdGFuY2UgaW5zaWRlIGJveCB3aGljaCBpcyBzYW1lIGFzIG1vdmluZyBtb3VzZQorCQkJICAgIG91dHNpZGUgYm94LCB0byB0cmlnZ2VyIHNjcm9sbGluZyBvZiBMQiAqLworCisjZGVmaW5lIE1BVENIX1NVQlNUUiAgICAgICAgICAgIDIKKyNkZWZpbmUgTUFUQ0hfRVhBQ1QgICAgICAgICAgICAgMQorI2RlZmluZSBNQVRDSF9ORUFSRVNUICAgICAgICAgICAwCisKK3N0YXRpYyB2b2lkIExpc3RCb3hJbml0aWFsaXplKExQSEVBRExJU1QgbHBobCkKK3sKKyAgbHBobC0+bHBGaXJzdCAgICAgICAgPSBOVUxMOworICBscGhsLT5JdGVtc0NvdW50ICAgICA9IDA7CisgIGxwaGwtPkl0ZW1zVmlzaWJsZSAgID0gMDsKKyAgbHBobC0+Rmlyc3RWaXNpYmxlICAgPSAwOworICBscGhsLT5Db2x1bW5zVmlzaWJsZSA9IDE7CisgIGxwaGwtPkl0ZW1zUGVyQ29sdW1uID0gMDsKKyAgbHBobC0+SXRlbUZvY3VzZWQgICAgPSAtMTsKKyAgbHBobC0+UHJldkZvY3VzZWQgICAgPSAtMTsKK30KKwordm9pZCBDcmVhdGVMaXN0Qm94U3RydWN0KEhXTkQgaHduZCwgV09SRCBDdGxUeXBlLCBMT05HIHN0eWxlcywgSFdORCBwYXJlbnQpCit7CisgIExQSEVBRExJU1QgbHBobDsKKyAgSERDMzIgICAgICAgICBoZGM7CisKKyAgbHBobCA9IChMUEhFQURMSVNUKXhtYWxsb2Moc2l6ZW9mKEhFQURMSVNUKSk7CisgIFNldFdpbmRvd0xvbmczMkEoaHduZCwgMCwgKExPTkcpbHBobCk7CisgIExpc3RCb3hJbml0aWFsaXplKGxwaGwpOworICBscGhsLT5EcmF3Q3RsVHlwZSAgICA9IEN0bFR5cGU7CisgIGxwaGwtPkN0bElEICAgICAgICAgID0gR2V0V2luZG93V29yZChod25kLEdXV19JRCk7CisgIGxwaGwtPmJSZWRyYXdGbGFnICAgID0gVFJVRTsKKyAgbHBobC0+aU51bVN0b3BzICAgICAgPSAwOworICBscGhsLT5UYWJTdG9wcyAgICAgICA9IE5VTEw7CisgIGxwaGwtPmhGb250ICAgICAgICAgID0gR2V0U3RvY2tPYmplY3QzMihTWVNURU1fRk9OVCk7CisgIGxwaGwtPmhTZWxmICAgICAgICAgID0gaHduZDsgIAorICBpZiAoQ3RsVHlwZT09T0RUX0NPTUJPQk9YKSAgICAgICAgICAgICAgLyogdXNlIHRoZSAiZmFrZWQiIHN0eWxlIGZvciBDT01CT0xCT1ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExCU19TT1JUIGluc3RlYWQgQ0JTX1NPUlQgZS5nLiAgICAgICovCisgICAgbHBobC0+ZHdTdHlsZSAgID0gTUFLRUxPTkcoTE9XT1JEKHN0eWxlcyksSElXT1JEKEdldFdpbmRvd0xvbmczMkEoaHduZCxHV0xfU1RZTEUpKSk7CisgIGVsc2UKKyAgICBscGhsLT5kd1N0eWxlICAgPSBHZXRXaW5kb3dMb25nMzJBKGh3bmQsR1dMX1NUWUxFKTsgLyogdXNlIG9yaWdpbmFsIHN0eWxlIGR3b3JkICovCisgIGxwaGwtPmhQYXJlbnQgICAgICAgID0gcGFyZW50OworICBscGhsLT5TdGRJdGVtSGVpZ2h0ICA9IDE1OyAvKiBGSVhNRTogc2hvdWxkIGdldCB0aGUgZm9udCBoZWlnaHQgKi8KKyAgbHBobC0+T3duZXJEcmF3biAgICAgPSBzdHlsZXMgJiAoTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX09XTkVSRFJBV1ZBUklBQkxFKTsKKyAgbHBobC0+SGFzU3RyaW5ncyAgICAgPSAoc3R5bGVzICYgTEJTX0hBU1NUUklOR1MpIHx8ICFscGhsLT5Pd25lckRyYXduOworCisgIC8qIGNyZWF0ZSBkdW1teSBoZGMgdG8gc2V0IHRleHQgaGVpZ2h0ICovCisgIGlmICgoaGRjID0gR2V0REMzMigwKSkpCisgIHsKKyAgICAgIFRFWFRNRVRSSUMxNiB0bTsKKyAgICAgIEdldFRleHRNZXRyaWNzMTYoIGhkYywgJnRtICk7CisgICAgICBscGhsLT5TdGRJdGVtSGVpZ2h0ID0gdG0udG1IZWlnaHQ7CisgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJDcmVhdGVMaXN0Qm94U3RydWN0OiAgZm9udCBoZWlnaHQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbHBobC0+U3RkSXRlbUhlaWdodCk7CisgICAgICBSZWxlYXNlREMzMiggMCwgaGRjICk7CisgIH0KKworICBpZiAobHBobC0+T3duZXJEcmF3bikKKyAgeworICAgIExJU1RTVFJVQ1QgZHVtbXlsczsKKyAgICAKKyAgICBscGhsLT5uZWVkTWVhc3VyZSA9IFRSVUU7CisgICAgZHVtbXlscy5taXMuQ3RsVHlwZSAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOworICAgIGR1bW15bHMubWlzLkN0bElEICAgICAgPSBscGhsLT5DdGxJRDsKKyAgICBkdW1teWxzLm1pcy5pdGVtSUQgICAgID0gLTE7CisgICAgZHVtbXlscy5taXMuaXRlbVdpZHRoICA9IDA7IC8qIGlnbm9yZWQgKi8KKyAgICBkdW1teWxzLm1pcy5pdGVtRGF0YSAgID0gMDsKKworICAgIExpc3RCb3hBc2tNZWFzdXJlKGxwaGwsJmR1bW15bHMpOworICB9CisKKyAgbHBobC0+SGVhcFNlbCA9IEdsb2JhbEFsbG9jMTYoR01FTV9GSVhFRCxMSVNUX0hFQVBfU0laRSk7CisgIExvY2FsSW5pdCggbHBobC0+SGVhcFNlbCwgMCwgTElTVF9IRUFQX1NJWkUtMSk7Cit9CisKKy8qIFNlbmQgbm90aWZpY2F0aW9uICJjb2RlIiBhcyBwYXJ0IG9mIGEgV01fQ09NTUFORC1tZXNzYWdlIGlmIGh3bmQKKyAgIGhhcyB0aGUgTEJTX05PVElGWSBzdHlsZSAqLwordm9pZCBMaXN0Qm94U2VuZE5vdGlmaWNhdGlvbihMUEhFQURMSVNUIGxwaGwsIFdPUkQgY29kZSkKK3sKKyAgaWYgKGxwaGwtPmR3U3R5bGUgJiBMQlNfTk9USUZZKQorICAgICAgU2VuZE1lc3NhZ2UzMkEoIGxwaGwtPmhQYXJlbnQsIFdNX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRVdQQVJBTSggbHBobC0+Q3RsSUQsIGNvZGUpLCAoTFBBUkFNKWxwaGwtPmhTZWxmICk7Cit9CisKKworLyogZ2V0IHRoZSBtYXhpbXVtIHZhbHVlIG9mIGxwaGwtPkZpcnN0VmlzaWJsZSAqLworaW50IExpc3RNYXhGaXJzdFZpc2libGUoTFBIRUFETElTVCBscGhsKQoreworICAgIGludCBtID0gbHBobC0+SXRlbXNDb3VudC1scGhsLT5JdGVtc1Zpc2libGU7CisgICAgcmV0dXJuIChtIDwgMCkgPyAwIDogbTsKK30KKworCisvKiBSZXR1cm5zOiAwIGlmIG5vdGhpbmcgbmVlZHMgdG8gYmUgY2hhbmdlZCAqLworLyogICAgICAgICAgMSBpZiBGaXJzdFZpc2libGUgY2hhbmdlZCAqLworCitpbnQgTGlzdEJveFNjcm9sbFRvRm9jdXMoTFBIRUFETElTVCBscGhsKQoreworICBzaG9ydCAgICAgICBlbmQ7CisKKyAgaWYgKGxwaGwtPkl0ZW1zQ291bnQgPT0gMCkgcmV0dXJuIDA7CisgIGlmIChscGhsLT5JdGVtRm9jdXNlZCA9PSAtMSkgcmV0dXJuIDA7CisKKyAgZW5kID0gbHBobC0+Rmlyc3RWaXNpYmxlICsgbHBobC0+SXRlbXNWaXNpYmxlIC0gMTsKKworICBpZiAobHBobC0+SXRlbUZvY3VzZWQgPCBscGhsLT5GaXJzdFZpc2libGUgKSB7CisgICAgbHBobC0+Rmlyc3RWaXNpYmxlID0gbHBobC0+SXRlbUZvY3VzZWQ7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgaWYgKGxwaGwtPkl0ZW1Gb2N1c2VkID4gZW5kKSB7CisgICAgICBXT1JEIG1heEZpcnN0VmlzaWJsZSA9IExpc3RNYXhGaXJzdFZpc2libGUobHBobCk7CisKKyAgICAgIGxwaGwtPkZpcnN0VmlzaWJsZSA9IGxwaGwtPkl0ZW1Gb2N1c2VkOworICAgICAgCisgICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID4gbWF4Rmlyc3RWaXNpYmxlKSB7CisJbHBobC0+Rmlyc3RWaXNpYmxlID0gbWF4Rmlyc3RWaXNpYmxlOworICAgICAgfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICB9IAorICByZXR1cm4gMDsKK30KKworCitMUExJU1RTVFJVQ1QgTGlzdEJveEdldEl0ZW0oTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisgIFVJTlQgICAgICAgICBDb3VudCA9IDA7CisKKyAgaWYgKHVJbmRleCA+PSBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTlVMTDsKKworICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgd2hpbGUgKENvdW50KysgPCB1SW5kZXgpIGxwbHMgPSBscGxzLT5scE5leHQ7CisgIHJldHVybiBscGxzOworfQorCisKK3ZvaWQgTGlzdEJveERyYXdJdGVtKEhXTkQgaHduZCwgTFBIRUFETElTVCBscGhsLCBIREMxNiBoZGMsIExQTElTVFNUUlVDVCBscGxzLCAKKyAgICAgICAgICAgICAgICAgICAgIFJFQ1QxNiAqcmVjdCwgV09SRCBpdGVtQWN0aW9uLCBXT1JEIGl0ZW1TdGF0ZSkKK3sKKyAgICBpZiAobHBobC0+T3duZXJEcmF3bikKKyAgICB7CisgICAgICAgIERSQVdJVEVNU1RSVUNUMzIgZGlzOworCisgICAgICAgIGRpcy5DdGxJRCAgICAgID0gbHBscy0+bWlzLkN0bElEOworICAgICAgICBkaXMuQ3RsVHlwZSAgICA9IGxwbHMtPm1pcy5DdGxUeXBlOworICAgICAgICBkaXMuaXRlbUlEICAgICA9IGxwbHMtPm1pcy5pdGVtSUQ7CisgICAgICAgIGRpcy5oREMgICAgICAgID0gaGRjOworICAgICAgICBkaXMuaHduZEl0ZW0gICA9IGh3bmQ7CisgICAgICAgIGRpcy5pdGVtRGF0YSAgID0gbHBscy0+bWlzLml0ZW1EYXRhOworICAgICAgICBkaXMuaXRlbUFjdGlvbiA9IGl0ZW1BY3Rpb247CisgICAgICAgIGRpcy5pdGVtU3RhdGUgID0gaXRlbVN0YXRlOworICAgICAgICBDT05WX1JFQ1QxNlRPMzIoIHJlY3QsICZkaXMucmNJdGVtICk7CisgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBscGhsLT5oUGFyZW50LCBXTV9EUkFXSVRFTSwgZGlzLkN0bElELCAoTFBBUkFNKSZkaXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaXRlbUFjdGlvbiA9PSBPREFfRFJBV0VOVElSRSB8fCBpdGVtQWN0aW9uID09IE9EQV9TRUxFQ1QpIHsKKyAgICAgIGludCAJT2xkQmtNb2RlOworICAgICAgRFdPUkQgCWR3T2xkVGV4dENvbG9yID0gMDsKKworICAgICAgT2xkQmtNb2RlID0gU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworCisgICAgICBpZiAoaXRlbVN0YXRlICE9IDApIHsKKwlkd09sZFRleHRDb2xvciA9IFNldFRleHRDb2xvcihoZGMsIDB4MDBGRkZGRkZMKTsKKwlGaWxsUmVjdDE2KGhkYywgcmVjdCwgR2V0U3RvY2tPYmplY3QzMihCTEFDS19CUlVTSCkpOworICAgICAgfQorCisgICAgICBpZiAobHBobC0+ZHdTdHlsZSAmIExCU19VU0VUQUJTVE9QUykgeworCVRhYmJlZFRleHRPdXQoaGRjLCByZWN0LT5sZWZ0ICsgNSwgcmVjdC0+dG9wICsgMiwgCisJCSAgICAgIChjaGFyICopbHBscy0+aXRlbVRleHQsIHN0cmxlbigoY2hhciAqKWxwbHMtPml0ZW1UZXh0KSwgCisJCSAgICAgIGxwaGwtPmlOdW1TdG9wcywgbHBobC0+VGFiU3RvcHMsIDApOworICAgICAgfSBlbHNlIHsKKwlUZXh0T3V0MTYoaGRjLCByZWN0LT5sZWZ0ICsgNSwgcmVjdC0+dG9wICsgMiwKKyAgICAgICAgICAgICAgICAgIChjaGFyICopbHBscy0+aXRlbVRleHQsIHN0cmxlbigoY2hhciAqKWxwbHMtPml0ZW1UZXh0KSk7CisgICAgICB9CisKKyAgICAgIGlmIChpdGVtU3RhdGUgIT0gMCkgeworCVNldFRleHRDb2xvcihoZGMsIGR3T2xkVGV4dENvbG9yKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgU2V0QmtNb2RlKGhkYywgT2xkQmtNb2RlKTsKKyAgICB9CisgICAgZWxzZSBEcmF3Rm9jdXNSZWN0MTYoaGRjLCByZWN0KTsKK30KKworCitpbnQgTGlzdEJveEZpbmRNb3VzZShMUEhFQURMSVNUIGxwaGwsIGludCBYLCBpbnQgWSkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHMgPSBscGhsLT5scEZpcnN0OworICBpbnQgICAgICAgICAgaSwgajsKKyAgUE9JTlQxNiAgICAgIHBvaW50OworICAKKyAgcG9pbnQueCA9IFg7IHBvaW50LnkgPSBZOworICBpZiAobHBobC0+SXRlbXNDb3VudCA9PSAwKSByZXR1cm4gTEJfRVJSOworCisgIGZvcihpID0gMDsgaSA8IGxwaGwtPkZpcnN0VmlzaWJsZTsgaSsrKSB7CisgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzID0gbHBscy0+bHBOZXh0OworICB9CisgIGZvcihqID0gMDsgaiA8IGxwaGwtPkl0ZW1zVmlzaWJsZTsgaSsrLCBqKyspIHsKKyAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGlmIChQdEluUmVjdDE2KCZscGxzLT5pdGVtUmVjdCxwb2ludCkpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBscGxzID0gbHBscy0+bHBOZXh0OworICB9CisgIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkxpc3RCb3hGaW5kTW91c2U6IG5vdCBmb3VuZFxuIik7CisgIHJldHVybiBMQl9FUlI7Cit9CisKK0JPT0wzMiBsYkRlbGV0ZUl0ZW1Ob3RpZnkoTFBIRUFETElTVCBscGhsLCBMUExJU1RTVFJVQ1QgbHBscykKK3sKKyAgICAvKiBjYWxsZWQgb25seSBmb3Igb3duZXIgZHJhd24gbGlzdGJveGVzICovCisgICAgQk9PTDMyIHJldDsKKyAgICBERUxFVEVJVEVNU1RSVUNUMTYgKmRlbEl0ZW0gPSBTRUdQVFJfTkVXKERFTEVURUlURU1TVFJVQ1QxNik7CisgICAgaWYgKCFkZWxJdGVtKSByZXR1cm4gRkFMU0U7CisKKyAgICBkZWxJdGVtLT5DdGxUeXBlICA9IGxwaGwtPkRyYXdDdGxUeXBlOworICAgIGRlbEl0ZW0tPkN0bElEICAgID0gbHBobC0+Q3RsSUQ7CisgICAgZGVsSXRlbS0+aXRlbUlEICAgPSBscGxzLT5taXMuaXRlbUlEOworICAgIGRlbEl0ZW0tPmh3bmRJdGVtID0gbHBobC0+aFNlbGY7CisgICAgZGVsSXRlbS0+aXRlbURhdGEgPSBscGxzLT5taXMuaXRlbURhdGE7CisKKyAgICByZXQgPSBTZW5kTWVzc2FnZTE2KCBscGhsLT5oUGFyZW50LCBXTV9ERUxFVEVJVEVNLCAoV1BBUkFNMTYpbHBobC0+Q3RsSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGRlbEl0ZW0pICk7CisgICAgU0VHUFRSX0ZSRUUoZGVsSXRlbSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RyaW5ncyBhbmQgaXRlbSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBMaXN0Qm94QXNrTWVhc3VyZShMUEhFQURMSVNUIGxwaGwsIExQTElTVFNUUlVDVCBscGxzKSAgCit7CisgICAgTUVBU1VSRUlURU1TVFJVQ1QxNiAqbHBtZWFzdXJlID0gU0VHUFRSX05FVyhNRUFTVVJFSVRFTVNUUlVDVDE2KTsKKyAgICBpZiAoIWxwbWVhc3VyZSkgcmV0dXJuOworICAgICpscG1lYXN1cmUgPSBscGxzLT5taXM7CisgICAgbHBtZWFzdXJlLT5pdGVtSGVpZ2h0ID0gbHBobC0+U3RkSXRlbUhlaWdodDsKKyAgICBTZW5kTWVzc2FnZTE2KCBscGhsLT5oUGFyZW50LCBXTV9NRUFTVVJFSVRFTSwgbHBobC0+Q3RsSUQsCisgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGxwbWVhc3VyZSkgKTsKKworICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV0ZJWEVEKQorICAgIHsKKyAgICAgICAgaWYgKGxwbWVhc3VyZS0+aXRlbUhlaWdodCA+IGxwaGwtPlN0ZEl0ZW1IZWlnaHQpCisgICAgICAgICAgICBscGhsLT5TdGRJdGVtSGVpZ2h0ID0gbHBtZWFzdXJlLT5pdGVtSGVpZ2h0OworICAgICAgICBscGxzLT5taXMuaXRlbUhlaWdodCA9IGxwbWVhc3VyZS0+aXRlbUhlaWdodDsKKyAgICB9CisgICAgU0VHUFRSX0ZSRUUobHBtZWFzdXJlKTsKK30KKworc3RhdGljIExQTElTVFNUUlVDVCBMaXN0Qm94Q3JlYXRlSXRlbShMUEhFQURMSVNUIGxwaGwsIGludCBpZCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHNuZXcgPSAoTFBMSVNUU1RSVUNUKW1hbGxvYyhzaXplb2YoTElTVFNUUlVDVCkpOworCisgIGlmIChscGxzbmV3ID09IE5VTEwpIHJldHVybiBOVUxMOworICAKKyAgbHBsc25ldy0+aXRlbVN0YXRlICAgICAgPSAwOworICBscGxzbmV3LT5taXMuQ3RsVHlwZSAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOworICBscGxzbmV3LT5taXMuQ3RsSUQgICAgICA9IGxwaGwtPkN0bElEOworICBscGxzbmV3LT5taXMuaXRlbUlEICAgICA9IGlkOworICBscGxzbmV3LT5taXMuaXRlbUhlaWdodCA9IGxwaGwtPlN0ZEl0ZW1IZWlnaHQ7CisgIGxwbHNuZXctPm1pcy5pdGVtV2lkdGggID0gMDsgLyogaWdub3JlZCAqLworICBscGxzbmV3LT5taXMuaXRlbURhdGEgICA9IDA7CisgIFNldFJlY3RFbXB0eTE2KCAmbHBsc25ldy0+aXRlbVJlY3QgKTsKKworICByZXR1cm4gbHBsc25ldzsKK30KKworc3RhdGljIGludCBMaXN0Qm94QXNrQ29tcGFyZShMUEhFQURMSVNUIGxwaGwsIGludCBzdGFydEl0ZW0sIFNFR1BUUiBtYXRjaERhdGEsIEJPT0wgZXhhY3RNYXRjaCApCit7CisgLyogIERvIGJpbmFyeSBzZWFyY2ggZm9yIHNvcnRlZCBsaXN0Ym94ZXMuIExpbmtlZCBsaXN0IGl0ZW0gc3RvcmFnZSBzb3J0IG9mIAorICAqICBkZWZlYXRzIHRoZSBwdXJwb3NlICggZm9yY2VzIHRvIHRyYXZlcnNlIGl0ZW0gbGlzdCBhbGwgdGhlIHRpbWUgKSBidXQgTSQgZG9lcyBpdCB0aGlzIHdheS4uLgorICAqCisgICogIE1BVENIX05FQVJFU1QgKDApIC0gcmV0dXJuIHBvc2l0aW9uIGZvciBpbnNlcnRpb24gLSBmb3IgYWxsIHN0eWxlcworICAqICBNQVRDSF9FWEFDVCAgICgxKSAtIHNlYXJjaCBmb3IgYW4gaXRlbSwgcmV0dXJuIGluZGV4IG9yIExCX0VSUiAKKyAgKiAgTUFUQ0hfU1VCU1RSICAoMikgLSBzYW1lIGFzIGV4YWN0IG1hdGNoIGJ1dCB3aXRoIHN0cm5jbXAgZm9yIHN0cmluZyBjb21wYXJpc2lvbgorICAqLworCisgQ09NUEFSRUlURU1TVFJVQ1QxNiAgICppdGVtQ21wOworIExQTElTVFNUUlVDVAkJY3VycmVudEl0ZW0gPSBOVUxMOworIExQQ1NUUgkJCW1hdGNoU3RyID0gKGxwaGwtPkhhc1N0cmluZ3MpPyhMUENTVFIpUFRSX1NFR19UT19MSU4obWF0Y2hEYXRhKTpOVUxMOworIGludCAgICAgICAgICAgICAgICAgICAgaGVhZCwgcG9zID0gLTEsIHRhaWwsIGxvb3AgPSAxOworIHNob3J0ICAgICAgICAgICAgICAgICAgYiA9IDAsIHNfbGVuZ3RoID0gMDsKKworIC8qIGNoZWNrIGlmIGVtcHR5ICovCisKKyBpZiggIWxwaGwtPkl0ZW1zQ291bnQgKQorICAgIHJldHVybiAoZXhhY3RNYXRjaCk/IExCX0VSUjogMDsKKworIC8qIHNldCB1cCB2YXJpYWJsZXMgKi8KKworIGlmKCBleGFjdE1hdGNoID09IE1BVENIX05FQVJFU1QgKQorICAgICBzdGFydEl0ZW0gPSAwOworIGVsc2UgaWYoICsrc3RhcnRJdGVtICkgCisgICB7CisgICAgIGxvb3AgPSAyOworICAgICBpZiggc3RhcnRJdGVtID49IGxwaGwtPkl0ZW1zQ291bnQgKSBzdGFydEl0ZW0gPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKKyAgIH0KKworIGlmKCBleGFjdE1hdGNoID09IE1BVENIX1NVQlNUUiAmJiBscGhsLT5IYXNTdHJpbmdzICkKKyAgIHsKKyAgICAgc19sZW5ndGggPSBzdHJsZW4oIG1hdGNoU3RyICk7CisgICAgIGlmKCAhc19sZW5ndGggKSByZXR1cm4gMDsgCQkgICAgICAgIC8qIGhlYWQgb2YgdGhlIGxpc3QgLSBlbXB0eSBzdHJpbmcgKi8KKyAgIH0KKworIGhlYWQgPSBzdGFydEl0ZW07IHRhaWwgPSBscGhsLT5JdGVtc0NvdW50IC0gMTsKKworIGRwcmludGZfbGlzdGJveChzdGRkZWIsIkFza0NvbXBhcmU6IGhlYWQgPSAlaSwgdGFpbCA9ICVpLCBkYXRhID0gJTA4eFxuIiwgaGVhZCwgdGFpbCwgKHVuc2lnbmVkKW1hdGNoRGF0YSApOworCisgaWYgKCEoaXRlbUNtcCA9IFNFR1BUUl9ORVcoQ09NUEFSRUlURU1TVFJVQ1QxNikpKSByZXR1cm4gMDsKKyBpdGVtQ21wLT5DdGxUeXBlICAgICAgICA9IGxwaGwtPkRyYXdDdGxUeXBlOworIGl0ZW1DbXAtPkN0bElEICAgICAgICAgID0gbHBobC0+Q3RsSUQ7CisgaXRlbUNtcC0+aHduZEl0ZW0gICAgICAgPSBscGhsLT5oU2VsZjsKKworIC8qIHNlYXJjaCBmcm9tIHN0YXJ0SXRlbSAqLworCisgd2hpbGUgKCBsb29wLS0gKQorICB7CisgICAgd2hpbGUoIGhlYWQgPD0gdGFpbCApCisgICAgIHsKKyAgICAgICBwb3MgPSAodGFpbCArIGhlYWQpLzI7CisgICAgICAgY3VycmVudEl0ZW0gPSBMaXN0Qm94R2V0SXRlbSggbHBobCwgcG9zICk7CisKKyAgICAgICBpZiggbHBobC0+SGFzU3RyaW5ncyApCisJIHsKKyAgICAgICAgICAgYiA9ICggc19sZW5ndGggKT8gbHN0cm5jbXBpMzJBKCBjdXJyZW50SXRlbS0+aXRlbVRleHQsIG1hdGNoU3RyLCBzX2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbHN0cmNtcGkzMkEoIGN1cnJlbnRJdGVtLT5pdGVtVGV4dCwgbWF0Y2hTdHIpOworCSB9CisgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICBpdGVtQ21wLT5pdGVtSUQxICAgICAgPSBwb3M7CisgICAgICAgICAgIGl0ZW1DbXAtPml0ZW1EYXRhMSAgICA9IGN1cnJlbnRJdGVtLT5taXMuaXRlbURhdGE7CisgICAgICAgICAgIGl0ZW1DbXAtPml0ZW1JRDIgICAgICA9IC0xOworICAgICAgICAgICBpdGVtQ21wLT5pdGVtRGF0YTIgICAgPSBtYXRjaERhdGE7CisKKyAgICAgICAgICAgYiA9IFNlbmRNZXNzYWdlMTYoIGxwaGwtPmhQYXJlbnQsIFdNX0NPTVBBUkVJVEVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdQQVJBTTE2KWxwaGwtPkN0bElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlTRUdQVFJfR0VUKGl0ZW1DbXApICk7CisgICAgICAgICB9CisKKyAgICAgICBpZiggYiA9PSAwICkKKyAgICAgICB7CisgICAgICAgICAgIFNFR1BUUl9GUkVFKGl0ZW1DbXApOworICAgICAgICAgICByZXR1cm4gcG9zOyAgLyogZm91bmQgZXhhY3QgbWF0Y2ggKi8KKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgaWYoIGIgPCAwICkgaGVhZCA9ICsrcG9zOworICAgICAgICAgZWxzZQorICAgICAgICAgICBpZiggYiA+IDAgKSB0YWlsID0gcG9zIC0gMTsKKyAgICAgfQorCisgICAgLyogcmVzZXQgdG8gc2VhcmNoIGZyb20gdGhlIGZpcnN0IGl0ZW0gKi8KKyAgICBoZWFkID0gMDsgdGFpbCA9IHN0YXJ0SXRlbSAtIDE7CisgIH0KKworIGRwcmludGZfbGlzdGJveChzdGRkZWIsIlx0LT4gcG9zID0gJWlcbiIsIHBvcyApOworIFNFR1BUUl9GUkVFKGl0ZW1DbXApOworCisgLyogaWYgd2UgZ290IGhlcmUgbWF0Y2ggaXMgbm90IGV4YWN0ICovCisKKyBpZiggcG9zIDwgMCApIHBvcyA9IDA7CisgZWxzZSBpZiggcG9zID4gbHBobC0+SXRlbXNDb3VudCApIHBvcyA9IGxwaGwtPkl0ZW1zQ291bnQ7CisKKyByZXR1cm4gKGV4YWN0TWF0Y2gpPyBMQl9FUlI6IHBvczsKK30KKworaW50IExpc3RCb3hJbnNlcnRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgTFBDU1RSIG5ld3N0cikKK3sKKyAgTFBMSVNUU1RSVUNUICpscHBscywgbHBsc25ldywgbHBsczsKKyAgSEFORExFMTYgaFN0cjsKKyAgTFBTVFIJc3RyOworICBVSU5UCUNvdW50OworICAgIAorICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94SW5zZXJ0U3RyaW5nKCVkLCAlcCk7XG4iLCB1SW5kZXgsIG5ld3N0cik7CisgICAgCisgIGlmICghbmV3c3RyKSByZXR1cm4gLTE7CisKKyAgaWYgKHVJbmRleCA9PSAoVUlOVCktMSkKKyAgICB1SW5kZXggPSBscGhsLT5JdGVtc0NvdW50OworCisgIGxwcGxzID0gJmxwaGwtPmxwRmlyc3Q7CisgIGZvcihDb3VudCA9IDA7IENvdW50IDwgdUluZGV4OyBDb3VudCsrKSB7CisgICAgaWYgKCpscHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICAgIGxwcGxzID0gKExQTElTVFNUUlVDVCAqKSAmKCpscHBscyktPmxwTmV4dDsKKyAgfQorICAgIAorICBscGxzbmV3ID0gTGlzdEJveENyZWF0ZUl0ZW0obHBobCwgQ291bnQpOworICAKKyAgaWYgKGxwbHNuZXcgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkbmltcCwiTGlzdEJveEluc2VydFN0cmluZygpIG91dCBvZiBtZW1vcnkgIVxuIik7CisgICAgcmV0dXJuIExCX0VSUlNQQUNFOworICB9CisKKyAgbHBsc25ldy0+bHBOZXh0ID0gKmxwcGxzOworICAqbHBwbHMgPSBscGxzbmV3OworICBscGhsLT5JdGVtc0NvdW50Kys7CisgIAorICBoU3RyID0gMDsKKyAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpIHsKKyAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCIgIHN0cmluZzogJXNcbiIsIG5ld3N0cik7CisgICAgaFN0ciA9IExJU1RfSEVBUF9BTExPQyhscGhsLCBMTUVNX01PVkVBQkxFLCBzdHJsZW4obmV3c3RyKSArIDEpOworICAgIHN0ciA9IChMUFNUUilMSVNUX0hFQVBfQUREUihscGhsLCBoU3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHJldHVybiBMQl9FUlJTUEFDRTsKKyAgICBzdHJjcHkoc3RyLCBuZXdzdHIpOyAKKyAgICBscGxzbmV3LT5pdGVtVGV4dCA9IHN0cjsKKyAgICAvKiBJJ20gbm90IHNvIHN1cmUgYWJvdXQgdGhlIG5leHQgb25lICovCisgICAgbHBsc25ldy0+bWlzLml0ZW1EYXRhID0gMDsKKyAgfSBlbHNlIHsKKyAgICBscGxzbmV3LT5pdGVtVGV4dCA9IE5VTEw7CisgICAgbHBsc25ldy0+bWlzLml0ZW1EYXRhID0gKERXT1JEKW5ld3N0cjsKKyAgfQorCisgIGxwbHNuZXctPm1pcy5pdGVtSUQgPSB1SW5kZXg7CisgIGxwbHNuZXctPmhEYXRhID0gaFN0cjsKKyAgCisgIC8qIGFkanVzdCB0aGUgaXRlbUlEIGZpZWxkIG9mIHRoZSBmb2xsb3dpbmcgZW50cmllcyAqLworICBmb3IobHBscyA9IGxwbHNuZXctPmxwTmV4dDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0KSB7CisgICAgICBscGxzLT5taXMuaXRlbUlEKys7CisgIH0KKyAKKyAgaWYgKGxwaGwtPm5lZWRNZWFzdXJlKSB7CisgICAgTGlzdEJveEFza01lYXN1cmUobHBobCwgbHBsc25ldyk7CisgIH0KKworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJMaXN0Qm94SW5zZXJ0U3RyaW5nIC8vIGNvdW50PSVkXG4iLCBscGhsLT5JdGVtc0NvdW50KTsKKyAgcmV0dXJuIHVJbmRleDsKK30KKworCitpbnQgTGlzdEJveEFkZFN0cmluZyhMUEhFQURMSVNUIGxwaGwsIFNFR1BUUiBpdGVtRGF0YSkKK3sKKyAgICBVSU5UIAlwb3MgPSAoVUlOVCkgLTE7CisgICAgTFBDU1RSCW5ld3N0ciA9IChscGhsLT5IYXNTdHJpbmdzKT8oTFBDU1RSKVBUUl9TRUdfVE9fTElOKGl0ZW1EYXRhKTooTFBDU1RSKWl0ZW1EYXRhOworCisgICAgaWYgKCBscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQgKSAKKwkgcG9zID0gTGlzdEJveEFza0NvbXBhcmUoIGxwaGwsIC0xLCBpdGVtRGF0YSwgTUFUQ0hfTkVBUkVTVCApOworCisgICAgcmV0dXJuIExpc3RCb3hJbnNlcnRTdHJpbmcobHBobCwgcG9zLCBuZXdzdHIpOworfQorCisKK2ludCBMaXN0Qm94R2V0VGV4dChMUEhFQURMSVNUIGxwaGwsIFVJTlQgdUluZGV4LCBMUFNUUiBPdXRTdHIpCit7CisgIExQTElTVFNUUlVDVCBscGxzOworCisgIGlmICghT3V0U3RyKSB7CisgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hHZXRUZXh0IC8vIE91dFN0cj09TlVMTFxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgKk91dFN0ciA9ICdcMCc7CisgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbSAobHBobCwgdUluZGV4KTsKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKworICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHsKKyAgICAqKChsb25nICopT3V0U3RyKSA9IGxwbHMtPm1pcy5pdGVtRGF0YTsKKyAgICByZXR1cm4gNDsKKyAgfQorCQorICBzdHJjcHkoT3V0U3RyLCBscGxzLT5pdGVtVGV4dCk7CisgIHJldHVybiBzdHJsZW4oT3V0U3RyKTsKK30KKworCitEV09SRCBMaXN0Qm94R2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisKKyAgbHBscyA9IExpc3RCb3hHZXRJdGVtIChscGhsLCB1SW5kZXgpOworICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICByZXR1cm4gbHBscy0+bWlzLml0ZW1EYXRhOworfQorCisKK2ludCBMaXN0Qm94U2V0SXRlbURhdGEoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCwgRFdPUkQgSXRlbURhdGEpCit7CisgIExQTElTVFNUUlVDVCBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgdUluZGV4KTsKKworICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworICBscGxzLT5taXMuaXRlbURhdGEgPSBJdGVtRGF0YTsKKyAgcmV0dXJuIDE7Cit9CisKKworaW50IExpc3RCb3hEZWxldGVTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIHVJbmRleCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHMsIGxwbHMyOworICBVSU5UCUNvdW50OworCisgIGlmICh1SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKworICBscGxzID0gbHBobC0+bHBGaXJzdDsKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKworICBpZiAodUluZGV4ID09IDApCisgIHsKKyAgICBpZiggbHBobC0+T3duZXJEcmF3biApCisgICAgICAgIGxiRGVsZXRlSXRlbU5vdGlmeSggbHBobCwgbHBscyk7CisgICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKKyAgfQorICBlbHNlIAorICB7CisgICAgTFBMSVNUU1RSVUNUIGxwbHMyID0gTlVMTDsKKyAgICBmb3IoQ291bnQgPSAwOyBDb3VudCA8IHVJbmRleDsgQ291bnQrKykgeworICAgICAgaWYgKGxwbHMtPmxwTmV4dCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOworCisgICAgICBscGxzMiA9IGxwbHM7CisgICAgICBscGxzID0gKExQTElTVFNUUlVDVClscGxzLT5scE5leHQ7CisgICAgfQorICAgIGlmKCBscGhsLT5Pd25lckRyYXduICkKKwlsYkRlbGV0ZUl0ZW1Ob3RpZnkoIGxwaGwsIGxwbHMpOworICAgIGxwbHMyLT5scE5leHQgPSBscGxzLT5scE5leHQ7CisgIH0KKworICAvKiBhZGp1c3QgdGhlIGl0ZW1JRCBmaWVsZCBvZiB0aGUgZm9sbG93aW5nIGVudHJpZXMgKi8KKyAgZm9yKGxwbHMyID0gbHBscy0+bHBOZXh0OyBscGxzMiAhPSBOVUxMOyBscGxzMiA9IGxwbHMyLT5scE5leHQpIHsKKyAgICAgIGxwbHMyLT5taXMuaXRlbUlELS07CisgIH0KKyAKKyAgbHBobC0+SXRlbXNDb3VudC0tOworCisgIGlmIChscGxzLT5oRGF0YSAhPSAwKSBMSVNUX0hFQVBfRlJFRShscGhsLCBscGxzLT5oRGF0YSk7CisgIGZyZWUobHBscyk7CisgIAorICByZXR1cm4gbHBobC0+SXRlbXNDb3VudDsKK30KKworc3RhdGljIGludCBsYkZpbmRTdHJpbmcoTFBIRUFETElTVCBscGhsLCBVSU5UIG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyLCBCT09MIG1hdGNoKQoreworICAvKiAgbWF0Y2ggaXMgZWl0aGVyIE1BVENIX1NVQlNUUiBvciBNQVRDSF9FWEFDVCAqLworCisgIExQTElTVFNUUlVDVCBscGxzOworICBVSU5UCSAgICAgICBDb3VudDsKKyAgVUlOVCAgICAgICAgIEZpcnN0ICAgICAgPSBuRmlyc3QgKyAxOworICBpbnQJICAgICAgIHNfbGVuZ3RoICAgPSAwOworICBMUFNUUiAgICAgICAgbHBNYXRjaFN0ciA9IChMUFNUUilNYXRjaFN0cjsKKworICBpZiAoRmlyc3QgPiBscGhsLT5JdGVtc0NvdW50KSByZXR1cm4gTEJfRVJSOworCisgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX1NPUlQgKQorICAgICAgcmV0dXJuIExpc3RCb3hBc2tDb21wYXJlKCBscGhsLCBuRmlyc3QsIE1hdGNoU3RyLCBtYXRjaCApOworCisgIGlmIChscGhsLT5IYXNTdHJpbmdzICkgCisgIHsKKyAgICBscE1hdGNoU3RyID0gUFRSX1NFR19UT19MSU4oTWF0Y2hTdHIpOworCisgICAgaWYoIG1hdGNoID09IE1BVENIX1NVQlNUUiApCisgICAgeworICAgICAgc19sZW5ndGggPSBzdHJsZW4obHBNYXRjaFN0cik7CisgICAgICBpZiggIXNfbGVuZ3RoICkgcmV0dXJuIChscGhsLT5JdGVtc0NvdW50KT8wOkxCX0VSUjsKKyAgICB9CisgIH0KKworICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgRmlyc3QpOworICBDb3VudCA9IDA7CisgIHdoaWxlKGxwbHMgIT0gTlVMTCkgCisgIHsKKyAgICBpZiAobHBobC0+SGFzU3RyaW5ncykgCisgICAgeworICAgICAgaWYgKCAoIHNfbGVuZ3RoICk/ICFsc3RybmNtcGkzMkEobHBscy0+aXRlbVRleHQsIGxwTWF0Y2hTdHIsIHNfbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICA6ICFsc3RyY21waTMyQShscGxzLT5pdGVtVGV4dCwgbHBNYXRjaFN0cikgICkgcmV0dXJuIENvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgICBpZiAoIGxwbHMtPm1pcy5pdGVtRGF0YSA9PSAoRFdPUkQpbHBNYXRjaFN0ciApIHJldHVybiBDb3VudDsKKworICAgIGxwbHMgPSBscGxzLT5scE5leHQ7CisgICAgQ291bnQrKzsKKyAgfQorCisgIC8qIFN0YXJ0IG92ZXIgYXQgdG9wICovCisgIENvdW50ID0gMDsKKyAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisKKyAgd2hpbGUgKENvdW50IDwgRmlyc3QpIAorICB7CisgICAgaWYgKGxwaGwtPkhhc1N0cmluZ3MpIAorICAgIHsKKyAgICAgIGlmICggKCBzX2xlbmd0aCApPyAhbHN0cm5jbXBpMzJBKGxwbHMtPml0ZW1UZXh0LCBscE1hdGNoU3RyLCBzX2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAhbHN0cmNtcGkzMkEobHBscy0+aXRlbVRleHQsIGxwTWF0Y2hTdHIpICApIHJldHVybiBDb3VudDsKKyAgICB9CisgICAgZWxzZQorICAgICAgaWYgKCBscGxzLT5taXMuaXRlbURhdGEgPT0gKERXT1JEKWxwTWF0Y2hTdHIgKSByZXR1cm4gQ291bnQ7CisgICAgCisgICAgbHBscyA9IGxwbHMtPmxwTmV4dDsKKyAgICBDb3VudCsrOworICB9CisKKyAgcmV0dXJuIExCX0VSUjsKK30KKworaW50IExpc3RCb3hGaW5kU3RyaW5nKExQSEVBRExJU1QgbHBobCwgVUlOVCBuRmlyc3QsIFNFR1BUUiBNYXRjaFN0cikKK3sKKyAgcmV0dXJuIGxiRmluZFN0cmluZyhscGhsLCBuRmlyc3QsIE1hdGNoU3RyLCBNQVRDSF9TVUJTVFIgKTsKK30KKworaW50IExpc3RCb3hGaW5kU3RyaW5nRXhhY3QoTFBIRUFETElTVCBscGhsLCBVSU5UIG5GaXJzdCwgU0VHUFRSIE1hdGNoU3RyKQoreworICByZXR1cm4gbGJGaW5kU3RyaW5nKGxwaGwsIG5GaXJzdCwgTWF0Y2hTdHIsIE1BVENIX0VYQUNUICk7Cit9CisKK2ludCBMaXN0Qm94UmVzZXRDb250ZW50KExQSEVBRExJU1QgbHBobCkKK3sKKyAgICBMUExJU1RTVFJVQ1QgbHBsczsKKyAgICBpbnQgaTsKKworICAgIGlmIChscGhsLT5JdGVtc0NvdW50ID09IDApIHJldHVybiAwOworCisgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hSZXNldENvbnRlbnQgLy8gSXRlbUNvdW50ID0gJWRcbiIsCisJbHBobC0+SXRlbXNDb3VudCk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKyAgICAgIGxwbHMgPSBscGhsLT5scEZpcnN0OworICAgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKworICAgICAgaWYgKGxwaGwtPk93bmVyRHJhd24pIGxiRGVsZXRlSXRlbU5vdGlmeShscGhsLCBscGxzKTsKKworICAgICAgbHBobC0+bHBGaXJzdCA9IGxwbHMtPmxwTmV4dDsKKyAgICAgIGlmIChscGxzLT5oRGF0YSAhPSAwKSBMSVNUX0hFQVBfRlJFRShscGhsLCBscGxzLT5oRGF0YSk7CisgICAgICBmcmVlKGxwbHMpOworICAgIH0KKyAgICBMaXN0Qm94SW5pdGlhbGl6ZShscGhsKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VsZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworaW50IExpc3RCb3hTZXRDdXJTZWwoTFBIRUFETElTVCBscGhsLCBXT1JEIHdJbmRleCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHM7CisKKyAgLyogdXNlIExpc3RCb3hTZXRTZWwgaW5zdGVhZCAqLworICBpZiAobHBobC0+ZHdTdHlsZSAmIChMQlNfTVVMVElQTEVTRUwgfCBMQlNfRVhURU5ERURTRUwpICkgcmV0dXJuIDA7CisKKyAgLyogdW5zZWxlY3QgcHJldmlvdXMgaXRlbSAqLworICBpZiAobHBobC0+SXRlbUZvY3VzZWQgIT0gLTEpIHsKKyAgICBscGhsLT5QcmV2Rm9jdXNlZCA9IGxwaGwtPkl0ZW1Gb2N1c2VkOworICAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCBscGhsLT5JdGVtRm9jdXNlZCk7CisgICAgaWYgKGxwbHMgPT0gMCkgcmV0dXJuIExCX0VSUjsKKyAgICBscGxzLT5pdGVtU3RhdGUgPSAwOworICB9CisKKyAgaWYgKCh3SW5kZXggIT0gKFVJTlQpLTEpICYmICh3SW5kZXggPCBscGhsLT5JdGVtc0NvdW50KSkKKyAgeworICAgIGxwaGwtPkl0ZW1Gb2N1c2VkID0gd0luZGV4OworICAgIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLCB3SW5kZXgpOworICAgIGlmIChscGxzID09IDApIHJldHVybiBMQl9FUlI7CisgICAgbHBscy0+aXRlbVN0YXRlID0gT0RTX1NFTEVDVEVEIHwgT0RTX0ZPQ1VTOworCisgICAgcmV0dXJuIDA7CisgIH0KKworICByZXR1cm4gTEJfRVJSOworfQorCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkaXIgbGlzdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTE9ORyBMaXN0Qm94RGlyZWN0b3J5KExQSEVBRExJU1QgbHBobCwgVUlOVCBhdHRyaWIsIExQQ1NUUiBmaWxlc3BlYykKK3sKKyAgICBjaGFyIAltYXNrWzEzXTsKKyAgICBjaGFyKgl0ZW1wID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKglwdHI7CisgICAgaW50IAlza2lwLCBjb3VudDsKKyAgICBMT05HIAlyZXQ7CisgICAgRE9TX0RJUkVOVCAJZW50cnk7CisgICAgY2hhciAqcGF0aCwgKnA7CisKKyAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdEJveERpcmVjdG9yeTogJyVzJyAlMDR4XG4iLCBmaWxlc3BlYywgYXR0cmliKTsKKyAgICBpZiAoIWZpbGVzcGVjKSByZXR1cm4gTEJfRVJSOworICAgIGlmICghKHB0ciA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggZmlsZXNwZWMsIEZBTFNFICkpKSByZXR1cm4gTEJfRVJSOworICAgIHBhdGggPSB4c3RyZHVwKHB0cik7CisgICAgcCA9IHN0cnJjaHIoIHBhdGgsICcvJyApOworICAgICpwKysgPSAnXDAnOworICAgIGlmICghKHB0ciA9IERPU0ZTX1RvRG9zRkNCRm9ybWF0KCBwICkpIHx8IAorICAgICAgICAhKHRlbXAgPSBTRUdQVFJfQUxMT0MoIHNpemVvZihjaGFyKSAqIDE2ICkpICkKKyAgICB7CisgICAgICAgIGZyZWUoIHBhdGggKTsKKyAgICAgICAgcmV0dXJuIExCX0VSUjsKKyAgICB9CisKKyAgICBzdHJjcHkoIG1hc2ssIHB0ciApOworCisgICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hEaXJlY3Rvcnk6IHBhdGg9JXMgbWFzaz0lc1xuIiwgcGF0aCwgbWFzayk7CisKKyAgICBza2lwID0gcmV0ID0gMDsKKyAgICBhdHRyaWIgJj0gfkZBX0xBQkVMOworICAgIHdoaWxlICgoY291bnQgPSBET1NGU19GaW5kTmV4dCggcGF0aCwgbWFzaywgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYiwgc2tpcCwgJmVudHJ5ICkpID4gMCkKKyAgICB7CisgICAgICAgIHNraXAgKz0gY291bnQ7CisgICAgICAgIGlmIChlbnRyeS5hdHRyICYgRkFfRElSRUNUT1JZKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGF0dHJpYiAmIERETF9ESVJFQ1RPUlkpICYmIHN0cmNtcChlbnRyeS5uYW1lLCAiLiAgICAgICAgICAiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHRlbXAsICJbJXNdIiwgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIGVudHJ5Lm5hbWUgKSApOworICAgICAgICAgICAgICAgIEFuc2lMb3dlciggdGVtcCApOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCBTRUdQVFJfR0VUKHRlbXApKSkgPT0gTEJfRVJSKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAvKiBub3QgYSBkaXJlY3RvcnkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEoYXR0cmliICYgRERMX0VYQ0xVU0lWRSkgfHwKKyAgICAgICAgICAgICAgICAoKGF0dHJpYiAmIChGQV9SRE9OTFl8RkFfSElEREVOfEZBX1NZU1RFTXxGQV9BUkNISVZFKSkgPT0KKyAgICAgICAgICAgICAgICAgKGVudHJ5LmF0dHIgJiAoRkFfUkRPTkxZfEZBX0hJRERFTnxGQV9TWVNURU18RkFfQVJDSElWRSkpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkoIHRlbXAsIERPU0ZTX1RvRG9zRFRBRm9ybWF0KCBlbnRyeS5uYW1lICkgKTsKKyAgICAgICAgICAgICAgICBBbnNpTG93ZXIoIHRlbXAgKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJcdG4gLSAlaSwgZmlsZSAnJXMnXG4iLCBjb3VudCwgdGVtcCk7IAorICAgIH0KKyAgICBpZiAoYXR0cmliICYgRERMX0RSSVZFUykKKyAgICB7CisgICAgICAgIGludCB4OworCURXT1JEIG9sZHN0eWxlID0gbHBobC0+ZHdTdHlsZTsKKwkgICAgCisJbHBobC0+ZHdTdHlsZSAmPSB+TEJTX1NPUlQ7CisgICAgICAgIHN0cmNweSggdGVtcCwgIlstYS1dIiApOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgTUFYX0RPU19EUklWRVM7IHgrKywgdGVtcFsyXSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoRFJJVkVfSXNWYWxpZCh4KSkKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7CisgICAgICAgIH0KKwlscGhsLT5kd1N0eWxlID0gb2xkc3R5bGU7CisgICAgfQorCisgICAgZnJlZSggcGF0aCApOworICAgIFNFR1BUUl9GUkVFKCB0ZW1wICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRpbWVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQgTGlzdEJveEdldEl0ZW1SZWN0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIExQUkVDVDE2IGxwcmVjdCkKK3sKKyAgTFBMSVNUU1RSVUNUIGxwbHMgPSBMaXN0Qm94R2V0SXRlbShscGhsLHdJbmRleCk7CisKKyAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwiTGlzdEJveCBMQl9HRVRJVEVNUkVDVCAlaSAlcCIsIHdJbmRleCxscGxzKTsKKyAgaWYgKGxwbHMgPT0gTlVMTCkKKyAgeworICAgIGlmIChscGhsLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKQorICAgICAgcmV0dXJuIExCX0VSUjsKKyAgICBlbHNlIAorICAgIHsKKyAgICAgR2V0Q2xpZW50UmVjdDE2KGxwaGwtPmhTZWxmLGxwcmVjdCk7CisgICAgIGxwcmVjdC0+Ym90dG9tPWxwaGwtPlN0ZEl0ZW1IZWlnaHQ7CisgICAgIGlmIChscHJlY3QtPnJpZ2h0PDApIGxwcmVjdC0+cmlnaHQ9MDsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgKmxwcmVjdCA9IGxwbHMtPml0ZW1SZWN0OworICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCIgPSAlZCwlZCAgJWQsJWRcbiIsIGxwcmVjdC0+bGVmdCxscHJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPnJpZ2h0LGxwcmVjdC0+Ym90dG9tKTsKKyAgcmV0dXJuIDA7Cit9CisKKworaW50IExpc3RCb3hTZXRJdGVtSGVpZ2h0KExQSEVBRExJU1QgbHBobCwgV09SRCB3SW5kZXgsIGxvbmcgaGVpZ2h0KQoreworICBMUExJU1RTVFJVQ1QgbHBsczsKKworICBpZiAoIShscGhsLT5kd1N0eWxlICYgTEJTX09XTkVSRFJBV1ZBUklBQkxFKSkgeworICAgIGxwaGwtPlN0ZEl0ZW1IZWlnaHQgPSAoc2hvcnQpaGVpZ2h0OworICAgIHJldHVybiAwOworICB9CisgIAorICBscGxzID0gTGlzdEJveEdldEl0ZW0obHBobCwgd0luZGV4KTsKKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgCisgIGxwbHMtPm1pcy5pdGVtSGVpZ2h0ID0gaGVpZ2h0OworICByZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RyaW5nIHNlYXJjaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8gIAorCitpbnQgTGlzdEJveEZpbmROZXh0TWF0Y2goTFBIRUFETElTVCBscGhsLCBXT1JEIHdDaGFyKQoreworICBMUExJU1RTVFJVQ1QgbHBsczsKKyAgVUlOVAkgICAgICAgY291bnQsZmlyc3Q7CisKKyAgaWYgKChjaGFyKXdDaGFyIDwgJyAnKSByZXR1cm4gTEJfRVJSOworICBpZiAoIWxwaGwtPkhhc1N0cmluZ3MpIHJldHVybiBMQl9FUlI7CisKKyAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CisgIAorICBmb3IgKGNvdW50ID0gMDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7CisgICAgaWYgKHRvbG93ZXIoKmxwbHMtPml0ZW1UZXh0KSA9PSB0b2xvd2VyKChjaGFyKXdDaGFyKSkgYnJlYWs7CisgIH0KKyAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKKyAgZmlyc3QgPSBjb3VudDsKKyAgZm9yKDsgbHBscyAhPSBOVUxMOyBscGxzID0gbHBscy0+bHBOZXh0LCBjb3VudCsrKSB7CisgICAgaWYgKCpscGxzLT5pdGVtVGV4dCAhPSAoY2hhcil3Q2hhcikgCisgICAgICBicmVhazsKKyAgICBpZiAoKHNob3J0KSBjb3VudCA+IGxwaGwtPkl0ZW1Gb2N1c2VkKQorICAgICAgcmV0dXJuIGNvdW50OworICB9CisgIHJldHVybiBmaXJzdDsKK30KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggMjEzMTZhMC4uMGZmYTNiNCAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTU0LDcgKzU0LDcgQEAKICNkZWZpbmUgU0NST0xMX0ZJUlNUX0RFTEFZICAgMjAwCiAKICAgLyogRGVsYXkgKGluIG1zKSBiZXR3ZWVuIHNjcm9sbCByZXBldGl0aW9ucyAqLwotI2RlZmluZSBTQ1JPTExfUkVQRUFUX0RFTEFZICAxMDAKKyNkZWZpbmUgU0NST0xMX1JFUEVBVF9ERUxBWSAgNTAKIAogICAvKiBTY3JvbGwgdGltZXIgaWQgKi8KICNkZWZpbmUgU0NST0xMX1RJTUVSICAgMApkaWZmIC0tZ2l0IGEvY29udHJvbHMvd2lkZ2V0cy5jIGIvY29udHJvbHMvd2lkZ2V0cy5jCmluZGV4IDg4ZDAxYTQuLmE4ODQ3NTcgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL3dpZGdldHMuYworKysgYi9jb250cm9scy93aWRnZXRzLmMKQEAgLTE2LDcgKzE2LDEyIEBACiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogCi0jZGVmaW5lIE9MRF9MSVNUQk9YCisvKiBXaW5kb3cgcHJvY2VkdXJlcyAqLworCitleHRlcm4gTFJFU1VMVCBMaXN0Qm94V25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CisKKy8qIFdpbjE2IGNsYXNzIGluZm8gKi8KIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTI3LDQyICszMiwzOSBAQAogICAgIExQQ1NUUiAgICAgY2xhc3NOYW1lOwogfSBCVUlMVElOX0NMQVNTX0lORk8xNjsKIAorLyogV2luMTYgYnVpbHQtaW4gY2xhc3NlcyAqLworCiBzdGF0aWMgY29uc3QgQlVJTFRJTl9DTEFTU19JTkZPMTYgV0lER0VUU19CdWlsdGluQ2xhc3NlczE2W10gPQogewogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQywKLSAgICAgICBzaXplb2YoU1RBVElDSU5GTyksIDAsICJTdGF0aWNXbmRQcm9jIiwgIlNUQVRJQyIgfSwKLSNpZmRlZiBPTERfTElTVEJPWAorICAgICAgIHNpemVvZihTVEFUSUNJTkZPKSwgMCwgIlN0YXRpY1duZFByb2MiLCAiU3RhdGljIiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQyB8IENTX0RCTENMS1MsCi0gICAgICA4LCAwLCAiTGlzdEJveFduZFByb2MiLCAiTElTVEJPWCIgfSwKLSNlbmRpZgotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQyB8IENTX0RCTENMS1MsCi0gICAgICA4LCAwLCAiQ29tYm9Cb3hXbmRQcm9jIiwgIkNPTUJPQk9YIiB9LAorICAgICAgOCwgMCwgIkNvbWJvQm94V25kUHJvYyIsICJDb21ib0JveCIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1NBVkVCSVRTLAotICAgICAgOCwgMCwgIkNvbWJvTEJveFduZFByb2MiLCAiQ09NQk9MQk9YIiB9LAorICAgICAgOCwgMCwgIkNvbWJvTEJveFduZFByb2MiLCAiQ29tYm9MQm94IiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19QQVJFTlREQyB8IENTX0RCTENMS1MsCi0gICAgICBzaXplb2YoRFdPUkQpLCAwLCAiRWRpdFduZFByb2MiLCAiRURJVCIgfSwKKyAgICAgIHNpemVvZihEV09SRCksIDAsICJFZGl0V25kUHJvYyIsICJFZGl0IiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywKICAgICAgIHNpemVvZihITUVOVTMyKSwgMCwgIlBvcHVwTWVudVduZFByb2MiLCBQT1BVUE1FTlVfQ0xBU1NfTkFNRSB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywKICAgICAgIERMR1dJTkRPV0VYVFJBLCAwLCAiRGVmRGxnUHJvYyIsIERJQUxPR19DTEFTU19OQU1FIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUywgc2l6ZW9mKE1ESUNMSUVOVElORk8pLAotICAgICAgU1RPQ0tfTFRHUkFZX0JSVVNILCAiTURJQ2xpZW50V25kUHJvYyIsICJNRElDTElFTlQiIH0KKyAgICAgIFNUT0NLX0xUR1JBWV9CUlVTSCwgIk1ESUNsaWVudFduZFByb2MiLCAiTURJQ2xpZW50IiB9CiB9OwogCiAjZGVmaW5lIE5CX0JVSUxUSU5fQ0xBU1NFUzE2IFwKICAgICAgICAgIChzaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczE2KS9zaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczE2WzBdKSkKIAorLyogV2luMzIgYnVpbHQtaW4gY2xhc3NlcyAqLwogCiBzdGF0aWMgV05EQ0xBU1MzMkEgV0lER0VUU19CdWlsdGluQ2xhc3NlczMyW10gPQogewogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcgfCBDU19QQVJFTlREQywKLSAgICAgIEJ1dHRvblduZFByb2MsIDAsIHNpemVvZihCVVRUT05JTkZPKSwgMCwgMCwgMCwgMCwgMCwgIkJVVFRPTiIgfSwKLSNpZm5kZWYgT0xEX0xJU1RCT1gKKyAgICAgIEJ1dHRvblduZFByb2MsIDAsIHNpemVvZihCVVRUT05JTkZPKSwgMCwgMCwgMCwgMCwgMCwgIkJ1dHRvbiIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyAvKnwgQ1NfUEFSRU5UREMqLywKLSAgICAgIExpc3RCb3hXbmRQcm9jMzIsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCAwLCAwLCAwLCAiTElTVEJPWCIgfSwKLSNlbmRpZgorICAgICAgTGlzdEJveFduZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCAwLCAwLCAwLCAiTGlzdEJveCIgfSwKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXIHwgQ1NfUEFSRU5UREMsCi0gICAgICBTY3JvbGxCYXJXbmRQcm9jLCAwLCBzaXplb2YoU0NST0xMQkFSX0lORk8pLCAwLCAwLCAwLCAwLCAwLCAiU0NST0xMQkFSIn0sCisgICAgICBTY3JvbGxCYXJXbmRQcm9jLCAwLCBzaXplb2YoU0NST0xMQkFSX0lORk8pLCAwLCAwLCAwLCAwLCAwLCAiU2Nyb2xsQmFyIn0sCiAgICAgeyBDU19HTE9CQUxDTEFTUywgRGVza3RvcFduZFByb2MsIDAsIHNpemVvZihERVNLVE9QSU5GTyksCiAgICAgICAwLCAwLCAwLCAwLCAwLCBERVNLVE9QX0NMQVNTX05BTUUgfQogfTsKQEAgLTcxLDYgKzczLDggQEAKICAgICAgICAgIChzaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczMyKS9zaXplb2YoV0lER0VUU19CdWlsdGluQ2xhc3NlczMyWzBdKSkKIAogCisvKiBXaW4zMiBjb21tb24gY29udHJvbHMgKi8KKwogc3RhdGljIFdORENMQVNTMzJBIFdJREdFVFNfQ29tbW9uQ29udHJvbHMzMltdID0KIHsKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfVlJFRFJBVyB8IENTX0hSRURSQVcsIFN0YXR1c1dpbmRvd1Byb2MsIDAsCmRpZmYgLS1naXQgYS9maWxlcy9wcm9maWxlLmMgYi9maWxlcy9wcm9maWxlLmMKaW5kZXggZGRiMjFlZC4uZDFhODQyNiAxMDA2NDQKLS0tIGEvZmlsZXMvcHJvZmlsZS5jCisrKyBiL2ZpbGVzL3Byb2ZpbGUuYwpAQCAtNSw2ICs1LDcgQEAKICAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMTMsNiArMTQsNyBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCisjaW5jbHVkZSAic3RyaW5nMzIuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKQEAgLTMzLDcgKzM1LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBpbnQgICAgICAgICAgICAgIGNoYW5nZWQ7CisgICAgQk9PTDMyICAgICAgICAgICBjaGFuZ2VkOwogICAgIFBST0ZJTEVTRUNUSU9OICAqc2VjdGlvbjsKICAgICBjaGFyICAgICAgICAgICAgKmRvc19uYW1lOwogfSBQUk9GSUxFOwpAQCAtNTUsNiArNTcsOCBAQAogCiAjZGVmaW5lIFdJTkVfSU5JX0dMT0JBTCBFVENESVIgIi93aW5lLmNvbmYiCiAKK3N0YXRpYyBMUENXU1RSIHdpbmluaVcgPSBOVUxMOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQUk9GSUxFX0NvcHlFbnRyeQogICoKQEAgLTIyNyw3ICsyMzEsNyBAQAogICoKICAqIERlbGV0ZSBhIHNlY3Rpb24gZnJvbSBhIHByb2ZpbGUgdHJlZS4KICAqLwotc3RhdGljIEJPT0wgUFJPRklMRV9EZWxldGVTZWN0aW9uKCBQUk9GSUxFU0VDVElPTiAqKnNlY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUgKQorc3RhdGljIEJPT0wzMiBQUk9GSUxFX0RlbGV0ZVNlY3Rpb24oIFBST0ZJTEVTRUNUSU9OICoqc2VjdGlvbiwgTFBDU1RSIG5hbWUgKQogewogICAgIHdoaWxlICgqc2VjdGlvbikKICAgICB7CkBAIC0yNTAsOCArMjU0LDggQEAKICAqCiAgKiBEZWxldGUgYSBrZXkgZnJvbSBhIHByb2ZpbGUgdHJlZS4KICAqLwotc3RhdGljIEJPT0wgUFJPRklMRV9EZWxldGVLZXkoIFBST0ZJTEVTRUNUSU9OICoqc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWUsIGNvbnN0IGNoYXIgKmtleV9uYW1lICkKK3N0YXRpYyBCT09MMzIgUFJPRklMRV9EZWxldGVLZXkoIFBST0ZJTEVTRUNUSU9OICoqc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzZWN0aW9uX25hbWUsIExQQ1NUUiBrZXlfbmFtZSApCiB7CiAgICAgd2hpbGUgKCpzZWN0aW9uKQogICAgIHsKQEAgLTMyMyw3ICszMjcsNyBAQAogICoKICAqIEZsdXNoIHRoZSBjdXJyZW50IHByb2ZpbGUgdG8gZGlzayBpZiBjaGFuZ2VkLgogICovCi1zdGF0aWMgQk9PTCBQUk9GSUxFX0ZsdXNoRmlsZSh2b2lkKQorc3RhdGljIEJPT0wzMiBQUk9GSUxFX0ZsdXNoRmlsZSh2b2lkKQogewogICAgIGNoYXIgKnAsIGJ1ZmZlcltNQVhfUEFUSE5BTUVfTEVOXTsKICAgICBjb25zdCBjaGFyICp1bml4X25hbWU7CkBAIC0zNjgsNyArMzcyLDcgQEAKICAqCiAgKiBPcGVuIGEgcHJvZmlsZSBmaWxlLCBjaGVja2luZyB0aGUgY2FjaGVkIGZpbGUgZmlyc3QuCiAgKi8KLXN0YXRpYyBCT09MIFBST0ZJTEVfT3BlbiggY29uc3QgY2hhciAqZmlsZW5hbWUgKQorc3RhdGljIEJPT0wzMiBQUk9GSUxFX09wZW4oIExQQ1NUUiBmaWxlbmFtZSApCiB7CiAgICAgY2hhciBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl07CiAgICAgY29uc3QgY2hhciAqZG9zX25hbWUsICp1bml4X25hbWU7CkBAIC00NDMsMTYgKzQ0NywxNSBAQAogICoKICAqIEVudW1lcmF0ZSBhbGwgdGhlIGtleXMgb2YgYSBzZWN0aW9uLgogICovCi1zdGF0aWMgSU5UIFBST0ZJTEVfR2V0U2VjdGlvbiggUFJPRklMRVNFQ1RJT04gKnNlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwgSU5UIGxlbiwgaW50IGhhbmRsZV9lbnYgKQorc3RhdGljIElOVDMyIFBST0ZJTEVfR2V0U2VjdGlvbiggUFJPRklMRVNFQ1RJT04gKnNlY3Rpb24sIExQQ1NUUiBzZWN0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsIElOVDMyIGxlbiwgQk9PTDMyIGhhbmRsZV9lbnYgKQogewogICAgIFBST0ZJTEVLRVkgKmtleTsKICAgICB3aGlsZSAoc2VjdGlvbikKICAgICB7CiAgICAgICAgIGlmIChzZWN0aW9uLT5uYW1lICYmICFsc3RyY21waTMyQSggc2VjdGlvbi0+bmFtZSwgc2VjdGlvbl9uYW1lICkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIElOVCBvbGRsZW4gPSBsZW47CisgICAgICAgICAgICBJTlQzMiBvbGRsZW4gPSBsZW47CiAgICAgICAgICAgICBmb3IgKGtleSA9IHNlY3Rpb24tPmtleTsga2V5OyBrZXkgPSBrZXktPm5leHQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAyKSBicmVhazsKQEAgLTQ3Niw4ICs0NzksOCBAQAogICoKICAqIEdldCBhIHByb2ZpbGUgc3RyaW5nLgogICovCi1zdGF0aWMgSU5UIFBST0ZJTEVfR2V0U3RyaW5nKCBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICprZXlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZl92YWwsIGNoYXIgKmJ1ZmZlciwgSU5UIGxlbiApCitzdGF0aWMgSU5UMzIgUFJPRklMRV9HZXRTdHJpbmcoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIga2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBkZWZfdmFsLCBMUFNUUiBidWZmZXIsIElOVDMyIGxlbiApCiB7CiAgICAgUFJPRklMRUtFWSAqa2V5ID0gTlVMTDsKIApAQCAtNTAwLDEwICs1MDMsMTAgQEAKICAqCiAgKiBTZXQgYSBwcm9maWxlIHN0cmluZy4KICAqLwotc3RhdGljIEJPT0wgUFJPRklMRV9TZXRTdHJpbmcoIGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgY29uc3QgY2hhciAqa2V5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWUgKQorc3RhdGljIEJPT0wzMiBQUk9GSUxFX1NldFN0cmluZyggTFBDU1RSIHNlY3Rpb25fbmFtZSwgTFBDU1RSIGtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHZhbHVlICkKIHsKLSAgICBCT09MIHJldDsKKyAgICBCT09MMzIgcmV0OwogCiAgICAgaWYgKCFrZXlfbmFtZSkgIC8qIERlbGV0ZSBhIHdob2xlIHNlY3Rpb24gKi8KICAgICB7CkBAIC02MjMsNjYgKzYyNiwxNTYgQEAKIH0KIAogCisvKioqKioqKioqKioqKioqKioqKioqIEFQSSBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0UHJvZmlsZUludCAgIChLRVJORUwuNTcpCisgKiAgICAgICAgICAgR2V0UHJvZmlsZUludDE2ICAgKEtFUk5FTC41NykKICAqLwotVUlOVCBHZXRQcm9maWxlSW50KCBMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGVudHJ5LCBJTlQgZGVmX3ZhbCApCitVSU5UMTYgR2V0UHJvZmlsZUludDE2KCBMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGVudHJ5LCBJTlQxNiBkZWZfdmFsICkKIHsKLSAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLCAid2luLmluaSIgKTsKKyAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVJbnQxNiggc2VjdGlvbiwgZW50cnksIGRlZl92YWwsICJ3aW4uaW5pIiApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFByb2ZpbGVTdHJpbmcgICAoS0VSTkVMLjU4KQorICogICAgICAgICAgIEdldFByb2ZpbGVJbnQzMkEgICAoS0VSTkVMMzIuMjY0KQogICovCi1JTlQgR2V0UHJvZmlsZVN0cmluZyggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgTFBDU1RSIGRlZl92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCBJTlQgbGVuICkKK1VJTlQzMiBHZXRQcm9maWxlSW50MzJBKCBMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGVudHJ5LCBJTlQzMiBkZWZfdmFsICkKIHsKLSAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW4sICJ3aW4uaW5pIiApOworICAgIHJldHVybiBHZXRQcml2YXRlUHJvZmlsZUludDMyQSggc2VjdGlvbiwgZW50cnksIGRlZl92YWwsICJ3aW4uaW5pIiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcm9maWxlSW50MzJXICAgKEtFUk5FTDMyLjI2NCkKKyAqLworVUlOVDMyIEdldFByb2ZpbGVJbnQzMlcoIExQQ1dTVFIgc2VjdGlvbiwgTFBDV1NUUiBlbnRyeSwgSU5UMzIgZGVmX3ZhbCApCit7CisgICAgaWYgKCF3aW5pbmlXKSB3aW5pbmlXID0gU1RSSU5HMzJfRHVwQW5zaVRvVW5pKCJ3aW4uaW5pIik7CisgICAgcmV0dXJuIEdldFByaXZhdGVQcm9maWxlSW50MzJXKCBzZWN0aW9uLCBlbnRyeSwgZGVmX3ZhbCwgd2luaW5pVyApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcm9maWxlU3RyaW5nMTYgICAoS0VSTkVMLjU4KQorICovCitJTlQxNiBHZXRQcm9maWxlU3RyaW5nMTYoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWZmZXIsIElOVDE2IGxlbiApCit7CisgICAgcmV0dXJuIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMTYoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxlbiwgIndpbi5pbmkiICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFByb2ZpbGVTdHJpbmczMkEgICAoS0VSTkVMMzIuMjY4KQorICovCitJTlQzMiBHZXRQcm9maWxlU3RyaW5nMzJBKCBMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGVudHJ5LCBMUENTVFIgZGVmX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UMzIgbGVuICkKK3sKKyAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW4sICJ3aW4uaW5pIiApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcm9maWxlU3RyaW5nMzJXICAgKEtFUk5FTDMyLjI2OSkKKyAqLworSU5UMzIgR2V0UHJvZmlsZVN0cmluZzMyVyggTFBDV1NUUiBzZWN0aW9uLExQQ1dTVFIgZW50cnksTFBDV1NUUiBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGJ1ZmZlciwgSU5UMzIgbGVuICkKK3sKKyAgICBpZiAoIXdpbmluaVcpIHdpbmluaVcgPSBTVFJJTkczMl9EdXBBbnNpVG9VbmkoIndpbi5pbmkiKTsKKyAgICByZXR1cm4gR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBsZW4sIHdpbmluaVcgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXcml0ZVByb2ZpbGVTdHJpbmcgICAoS0VSTkVMLjU5KQorICogICAgICAgICAgIFdyaXRlUHJvZmlsZVN0cmluZzE2ICAgKEtFUk5FTC41OSkKICAqLwotQk9PTCBXcml0ZVByb2ZpbGVTdHJpbmcoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBzdHJpbmcgKQorQk9PTDE2IFdyaXRlUHJvZmlsZVN0cmluZzE2KCBMUENTVFIgc2VjdGlvbiwgTFBDU1RSIGVudHJ5LCBMUENTVFIgc3RyaW5nICkKIHsKLSAgICByZXR1cm4gV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyggc2VjdGlvbiwgZW50cnksIHN0cmluZywgIndpbi5pbmkiICk7CisgICAgcmV0dXJuIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcxNiggc2VjdGlvbiwgZW50cnksIHN0cmluZywgIndpbi5pbmkiICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdyaXRlUHJvZmlsZVN0cmluZzMyQSAgIChLRVJORUwzMi41ODcpCisgKi8KK0JPT0wzMiBXcml0ZVByb2ZpbGVTdHJpbmczMkEoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBzdHJpbmcgKQoreworICAgIHJldHVybiBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCBzZWN0aW9uLCBlbnRyeSwgc3RyaW5nLCAid2luLmluaSIgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV3JpdGVQcm9maWxlU3RyaW5nMzJXICAgKEtFUk5FTDMyLjU4OCkKKyAqLworQk9PTDMyIFdyaXRlUHJvZmlsZVN0cmluZzMyVyggTFBDV1NUUiBzZWN0aW9uLCBMUENXU1RSIGVudHJ5LCBMUENXU1RSIHN0cmluZyApCit7CisgICAgaWYgKCF3aW5pbmlXKSB3aW5pbmlXID0gU1RSSU5HMzJfRHVwQW5zaVRvVW5pKCJ3aW4uaW5pIik7CisgICAgcmV0dXJuIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcoIHNlY3Rpb24sIGVudHJ5LCBzdHJpbmcsIHdpbmluaVcgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRQcml2YXRlUHJvZmlsZUludCAgIChLRVJORUwuMTI3KQorICogICAgICAgICAgIEdldFByaXZhdGVQcm9maWxlSW50MTYgICAoS0VSTkVMLjEyNykKICAqLwotVUlOVCBHZXRQcml2YXRlUHJvZmlsZUludCggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgSU5UIGRlZl92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZmlsZW5hbWUgKQorVUlOVDE2IEdldFByaXZhdGVQcm9maWxlSW50MTYoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIElOVDE2IGRlZl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGZpbGVuYW1lICkKK3sKKyAgICBsb25nIHJlc3VsdD0obG9uZylHZXRQcml2YXRlUHJvZmlsZUludDMyQShzZWN0aW9uLGVudHJ5LGRlZl92YWwsZmlsZW5hbWUpOworCisgICAgaWYgKHJlc3VsdCA+IDY1NTM1KSByZXR1cm4gNjU1MzU7CisgICAgaWYgKHJlc3VsdCA+PSAwKSByZXR1cm4gKFVJTlQxNilyZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA8IC0zMjc2OCkgcmV0dXJuIC0zMjc2ODsKKyAgICByZXR1cm4gKFVJTlQxNikoSU5UMTYpcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcml2YXRlUHJvZmlsZUludDMyQSAgIChLRVJORUwzMi4yNTEpCisgKi8KK1VJTlQzMiBHZXRQcml2YXRlUHJvZmlsZUludDMyQSggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgSU5UMzIgZGVmX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGZpbGVuYW1lICkKIHsKICAgICBjaGFyIGJ1ZmZlclsyMF07CiAgICAgY2hhciAqcDsKICAgICBsb25nIHJlc3VsdDsKIAotICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCBzZWN0aW9uLCBlbnRyeSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZpbGVuYW1lICk7Ci0gICAgaWYgKCFidWZmZXJbMF0pIHJldHVybiAoVUlOVClkZWZfdmFsOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCBzZWN0aW9uLCBlbnRyeSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGZpbGVuYW1lICk7CisgICAgaWYgKCFidWZmZXJbMF0pIHJldHVybiAoVUlOVDMyKWRlZl92YWw7CiAgICAgcmVzdWx0ID0gc3RydG9sKCBidWZmZXIsICZwLCAwICk7CiAgICAgaWYgKHAgPT0gYnVmZmVyKSByZXR1cm4gMDsgIC8qIE5vIGRpZ2l0cyBhdCBhbGwgKi8KLSNpZmRlZiBXSU5FTElCMzIKLSAgICByZXR1cm4gKFVJTlQpcmVzdWx0OwotI2Vsc2UKLSAgICBpZiAocmVzdWx0ID4gNjU1MzUpIHJldHVybiA2NTUzNTsKLSAgICBpZiAocmVzdWx0ID49IDApIHJldHVybiAoVUlOVClyZXN1bHQ7Ci0gICAgaWYgKHJlc3VsdCA8IC0zMjc2OCkgcmV0dXJuIC0zMjc2ODsKLSAgICByZXR1cm4gKFVJTlQpKElOVClyZXN1bHQ7Ci0jZW5kaWYKKyAgICByZXR1cm4gKFVJTlQzMilyZXN1bHQ7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFByaXZhdGVQcm9maWxlSW50MzJXICAgKEtFUk5FTDMyLjI1MikKKyAqLworVUlOVDMyIEdldFByaXZhdGVQcm9maWxlSW50MzJXKCBMUENXU1RSIHNlY3Rpb24sIExQQ1dTVFIgZW50cnksIElOVDMyIGRlZl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgZmlsZW5hbWUgKQoreworICAgIExQU1RSIHNlY3Rpb25BPXNlY3Rpb24/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKHNlY3Rpb24pOk5VTEw7CisgICAgTFBTVFIgZW50cnlBPWVudHJ5P1NUUklORzMyX0R1cFVuaVRvQW5zaShlbnRyeSk6TlVMTDsKKyAgICBMUFNUUiBmaWxlbmFtZUE9ZmlsZW5hbWU/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKGZpbGVuYW1lKTpOVUxMOworICAgIFVJTlQzMiByZXM7CisKKyAgICByZXM9R2V0UHJpdmF0ZVByb2ZpbGVJbnQzMkEoc2VjdGlvbkEsZW50cnlBLGRlZl92YWwsZmlsZW5hbWVBKTsKKyAgICBpZiAoc2VjdGlvbkEpIGZyZWUoc2VjdGlvbkEpOworICAgIGlmIChmaWxlbmFtZUEpIGZyZWUoZmlsZW5hbWVBKTsKKyAgICBpZiAoZW50cnlBKSBmcmVlKGVudHJ5QSk7CisgICAgcmV0dXJuIHJlczsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcgICAoS0VSTkVMLjEyOCkKKyAqICAgICAgICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzE2ICAgKEtFUk5FTC4xMjgpCiAgKi8KLUlOVCBHZXRQcml2YXRlUHJvZmlsZVN0cmluZyggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgTFBDU1RSIGRlZl92YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZmZlciwgSU5UIGxlbiwgTFBDU1RSIGZpbGVuYW1lICkKK0lOVDE2IEdldFByaXZhdGVQcm9maWxlU3RyaW5nMTYoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBkZWZfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCBJTlQxNiBsZW4sIExQQ1NUUiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKHNlY3Rpb24sZW50cnksZGVmX3ZhbCxidWZmZXIsbGVuLGZpbGVuYW1lKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEgICAoS0VSTkVMMzIuMjU1KQorICovCitJTlQzMiBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQSggTFBDU1RSIHNlY3Rpb24sIExQQ1NUUiBlbnRyeSwgTFBDU1RSIGRlZl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCBJTlQzMiBsZW4sIExQQ1NUUiBmaWxlbmFtZSApCiB7CiAgICAgaWYgKFBST0ZJTEVfT3BlbiggZmlsZW5hbWUgKSkKICAgICAgICAgcmV0dXJuIFBST0ZJTEVfR2V0U3RyaW5nKCBzZWN0aW9uLCBlbnRyeSwgZGVmX3ZhbCwgYnVmZmVyLCBsZW4gKTsKQEAgLTY5MCwxOCArNzgzLDczIEBACiAgICAgcmV0dXJuIHN0cmxlbiggYnVmZmVyICk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJXICAgKEtFUk5FTDMyLjI1NikKKyAqLworSU5UMzIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcoIExQQ1dTVFIgc2VjdGlvbixMUENXU1RSIGVudHJ5LExQQ1dTVFIgZGVmX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgYnVmZmVyLElOVDMyIGxlbixMUENXU1RSIGZpbGVuYW1lICkKK3sKKyAgICBMUFNUUglzZWN0aW9uQSA9IHNlY3Rpb24/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKHNlY3Rpb24pOk5VTEw7CisgICAgTFBTVFIJZW50cnlBID0gZW50cnk/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKGVudHJ5KTpOVUxMOworICAgIExQU1RSCWZpbGVuYW1lQSA9IGZpbGVuYW1lP1NUUklORzMyX0R1cFVuaVRvQW5zaShmaWxlbmFtZSk6TlVMTDsKKyAgICBMUFNUUglkZWZfdmFsQSA9IGRlZl92YWw/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKGRlZl92YWwpOk5VTEw7CisgICAgTFBTVFIJYnVmZmVyQSA9IHhtYWxsb2MobGVuKTsKKyAgICBJTlQzMglyZXQ7CisKKyAgICByZXQ9R2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoc2VjdGlvbkEsZW50cnlBLGRlZl92YWxBLGJ1ZmZlckEsbGVuLGZpbGVuYW1lQSk7CisgICAgaWYgKHNlY3Rpb25BKSBmcmVlKHNlY3Rpb25BKTsKKyAgICBpZiAoZW50cnlBKSBmcmVlKGVudHJ5QSk7CisgICAgaWYgKGZpbGVuYW1lQSkgZnJlZShmaWxlbmFtZUEpOworICAgIGlmIChkZWZfdmFsQSkgZnJlZShkZWZfdmFsQSk7CisKKyAgICBsc3RyY3B5bkF0b1coIGJ1ZmZlciwgYnVmZmVyQSwgbGVuICk7CisgICAgZnJlZShidWZmZXJBKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZyAgIChLRVJORUwuMTI5KQorICogICAgICAgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcxNiAgIChLRVJORUwuMTI5KQogICovCi1CT09MIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoIExQQ1NUUiBzZWN0aW9uLCBMUENTVFIgZW50cnksIExQQ1NUUiBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBmaWxlbmFtZSApCitCT09MMTYgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzE2KExQQ1NUUiBzZWN0aW9uLExQQ1NUUiBlbnRyeSxMUENTVFIgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZmlsZW5hbWUpCit7CisgICAgcmV0dXJuIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoc2VjdGlvbixlbnRyeSxzdHJpbmcsZmlsZW5hbWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJBICAgKEtFUk5FTDMyLjU4MikKKyAqLworQk9PTDMyIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEoTFBDU1RSIHNlY3Rpb24sTFBDU1RSIGVudHJ5LExQQ1NUUiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZmlsZW5hbWUgKQogewogICAgIGlmICghUFJPRklMRV9PcGVuKCBmaWxlbmFtZSApKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKCFzZWN0aW9uKSByZXR1cm4gUFJPRklMRV9GbHVzaEZpbGUoKTsKICAgICByZXR1cm4gUFJPRklMRV9TZXRTdHJpbmcoIHNlY3Rpb24sIGVudHJ5LCBzdHJpbmcgKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyVyAgIChLRVJORUwzMi41ODMpCisgKi8KK0JPT0wzMiBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJXKExQQ1dTVFIgc2VjdGlvbixMUENXU1RSIGVudHJ5LExQQ1dTVFIgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBmaWxlbmFtZSApCit7CisgICAgTFBTVFIgc2VjdGlvbkEgPSBzZWN0aW9uP1NUUklORzMyX0R1cFVuaVRvQW5zaShzZWN0aW9uKTpOVUxMOworICAgIExQU1RSIGVudHJ5QSA9IGVudHJ5P1NUUklORzMyX0R1cFVuaVRvQW5zaShlbnRyeSk6TlVMTDsKKyAgICBMUFNUUiBzdHJpbmdBID0gc3RyaW5nP1NUUklORzMyX0R1cFVuaVRvQW5zaShzdHJpbmcpOk5VTEw7CisgICAgTFBTVFIgZmlsZW5hbWVBID0gZmlsZW5hbWU/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKGZpbGVuYW1lKTpOVUxMOworICAgIEJPT0wzMiByZXM7CisKKyAgICByZXMgPSBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJBKHNlY3Rpb25BLGVudHJ5QSxzdHJpbmdBLGZpbGVuYW1lQSk7CisKKyAgICBpZiAoc2VjdGlvbkEpIGZyZWUoc2VjdGlvbkEpOworICAgIGlmIChlbnRyeUEpIGZyZWUoZW50cnlBKTsKKyAgICBpZiAoc3RyaW5nQSkgZnJlZShzdHJpbmdBKTsKKyAgICBpZiAoZmlsZW5hbWVBKSBmcmVlKGZpbGVuYW1lQSk7CisgICAgcmV0dXJuIHJlczsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXcml0ZU91dFByb2ZpbGVzICAgKEtFUk5FTC4zMTUpCmRpZmYgLS1naXQgYS9ncmFwaGljcy9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL01ha2VmaWxlLmluCmluZGV4IDliYjk1MzUuLmNjMTRmNWYgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL01ha2VmaWxlLmluCkBAIC02LDYgKzYsNyBAQAogTU9EVUxFICAgID0gZ3JhcGhpY3MKIAogQ19TUkNTID0gXAorCXdpbmcuYyBcCiAJYml0Ymx0LmMgXAogCWRyaXZlci5jCiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbmcuYyBiL2dyYXBoaWNzL3dpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNiMjlkCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3Mvd2luZy5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBXaW5nRyBzdXBwb3J0CisgKgorICogU3RhcnRlZCBieSBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQGNsaWMubmV0PgorICovCisKKyNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKy8qIEkgZHVubm8gaWYgdGhpcyBzdHJ1Y3R1cmUgY2FuIGJlIHB1dCBoZXJlLi4uIE1heWJlIGNvcHlyaWdodCwgSSdtIG5vIGxhd3llci4uLiAqLwordHlwZWRlZiBlbnVtIFdJTkdfRElUSEVSX1RZUEUKK3sKKyAgICBXSU5HX0RJU1BFUlNFRF80eDQsCisgICAgV0lOR19ESVNQRVJTRURfOHg4LAorCisgICAgV0lOR19DTFVTVEVSRURfNHg0CisKK30gV0lOR19ESVRIRVJfVFlQRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBXaW5nQ3JlYXRlREMxNgkoV0lORy4xMDAxKQorICovCitIREMxNiBXaW5HQ3JlYXRlREMxNih2b2lkKQoreworCS8qIEZJWE1FOiBQcm9iYWJseSB3cm9uZy4uLiAqLworCXJldHVybiBDcmVhdGVEQygiRElTUExBWSIsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFdpbkdSZWNvbW1lbmRESUJGb3JtYXQxNiAgICAoV0lORy4xMDAyKQorICovCitCT09MMTYgV2luR1JlY29tbWVuZERJQkZvcm1hdDE2KEJJVE1BUElORk8gKmZtdCkKK3sKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCJXaW5HUmVjb21tZW5kRElCRm9ybWF0OiBlbXB0eSBzdHViIVxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgIFdpbkdDcmVhdGVCaXRtYXAxNiAgICAoV0lORy4xMDAzKQorICovCitIQklUTUFQMTYgV2luR0NyZWF0ZUJpdG1hcDE2KEhEQzE2IHdpbkRDLCBCSVRNQVBJTkZPICpoZWFkZXIsIHZvaWQgKipiaXRzKQoreworICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIldpbkdDcmVhdGVCaXRtYXA6IGVtcHR5IHN0dWIhIChleHBlY3QgZmFpbHVyZSlcbiIpOworCSpiaXRzPTA7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIFdpbkdDcmVhdGVIYWxmVG9uZVBhbGV0dGUxNiAgIChXSU5HLjEwMDcpCisgKi8KK0hQQUxFVFRFMTYgV2luR0NyZWF0ZUhhbGZUb25lUGFsZXR0ZTE2KHZvaWQpCit7CisgICAgICAgIGZwcmludGYoc3RkbmltcCwiV2luR0NyZWF0ZUhhbGZUb25lUGFsZXR0ZTogZW1wdHkgc3R1YiFcbiIpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBXaW5HQ3JlYXRlSGFsZlRvbmVCcnVzaDE2ICAgKFdJTkcuMTAwOCkKKyAqLworSFBBTEVUVEUxNiBXaW5HQ3JlYXRlSGFsZlRvbmVCcnVzaDE2KEhEQzE2IHdpbkRDLCBDT0xPUlJFRiBjb2wsIFdJTkdfRElUSEVSX1RZUEUgdHlwZSkKK3sKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCJXaW5HQ3JlYXRlSGFsZlRvbmVCcnVzaDogZW1wdHkgc3R1YiFcbiIpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9pZjE2MzIvY3J0ZGxsLnNwZWMgYi9pZjE2MzIvY3J0ZGxsLnNwZWMKaW5kZXggNmUxNTY5My4uYmY3MDlmYiAxMDA2NDQKLS0tIGEvaWYxNjMyL2NydGRsbC5zcGVjCisrKyBiL2lmMTYzMi9jcnRkbGwuc3BlYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAzMzggc3R1YiBhYm9ydAogMzM5IGNkZWNsIGFicyhsb25nKSBDUlRETExfYWJzCiAzNDAgY2RlY2wgYWNvcyhsb25nKSBDUlRETExfYWNvcwotMzQxIHN0dWIgYXNjdGltZQorMzQxIGNkZWNsIGFzY3RpbWUocHRyKSBhc2N0aW1lCiAzNDIgY2RlY2wgYXNpbihsb25nKSBDUlRETExfYXNpbgogMzQzIGNkZWNsIGF0YW4obG9uZykgQ1JURExMX2F0YW4KIDM0NCBjZGVjbCBhdGFuMihsb25nIGxvbmcpIENSVERMTF9hdGFuMgpAQCAtMzUyLDE1ICszNTIsMTUgQEAKIDM0NyBjZGVjbCBhdG9pKHB0cikgQ1JURExMX2F0b2kKIDM0OCBjZGVjbCBhdG9sKHB0cikgQ1JURExMX2F0b2wKIDM0OSBzdHViIGJzZWFyY2gKLTM1MCBzdHViIGNhbGxvYworMzUwIGNkZWNsIGNhbGxvYyhsb25nIGxvbmcpIENSVERMTF9jYWxsb2MKIDM1MSBzdHViIGNlaWwKIDM1MiBzdHViIGNsZWFyZXJyCi0zNTMgc3R1YiBjbG9jaworMzUzIGNkZWNsIGNsb2NrKCkgY2xvY2sKIDM1NCBjZGVjbCBjb3MobG9uZykgQ1JURExMX2NvcwogMzU1IGNkZWNsIGNvc2gobG9uZykgQ1JURExMX2Nvc2gKLTM1NiBzdHViIGN0aW1lCiszNTYgY2RlY2wgY3RpbWUocHRyKSBjdGltZQogMzU3IHN0dWIgZGlmZnRpbWUKLTM1OCBzdHViIGRpdgorMzU4IGNkZWNsIGRpdihsb25nIGxvbmcpIGRpdgogMzU5IGNkZWNsIGV4aXQobG9uZykgQ1JURExMX2V4aXQKIDM2MCBjZGVjbCBleHAobG9uZykgQ1JURExMX2V4cAogMzYxIGNkZWNsIGZhYnMobG9uZykgQ1JURExMX2ZhYnMKQEAgLTM5NCw3ICszOTQsNyBAQAogMzg5IHN0dWIgZ2V0Y2hhcgogMzkwIHN0dWIgZ2V0ZW52CiAzOTEgY2RlY2wgZ2V0cyhwdHIpIENSVERMTF9nZXRzCi0zOTIgc3R1YiBnbXRpbWUKKzM5MiBjZGVjbCBnbXRpbWUocHRyKSBnbXRpbWUKIDM5MyBzdHViIGlzX3djdHlwZQogMzk0IGNkZWNsIGlzYWxudW0obG9uZykgQ1JURExMX2lzYWxudW0KIDM5NSBjZGVjbCBpc2FscGhhKGxvbmcpIENSVERMTF9pc2FscGhhCkBAIC00MjMsOSArNDIzLDkgQEAKIDQxOCBjZGVjbCBpc3hkaWdpdChsb25nKSBDUlRETExfaXN4ZGlnaXQKIDQxOSBjZGVjbCBsYWJzKGxvbmcpIENSVERMTF9sYWJzCiA0MjAgc3R1YiBsZGV4cAotNDIxIHN0dWIgbGRpdgorNDIxIGNkZWNsIGxkaXYobG9uZyBsb25nKSBsZGl2CiA0MjIgc3R1YiBsb2NhbGVjb252Ci00MjMgc3R1YiBsb2NhbHRpbWUKKzQyMyBjZGVjbCBsb2NhbHRpbWUocHRyKSBsb2NhbHRpbWUKIDQyNCBjZGVjbCBsb2cobG9uZykgQ1JURExMX2xvZwogNDI1IGNkZWNsIGxvZzEwKGxvbmcpIENSVERMTF9sb2cxMAogNDI2IHN0dWIgbG9uZ2ptcApAQCAtNDM4LDcgKzQzOCw3IEBACiA0MzMgY2RlY2wgbWVtY3B5KHB0ciBwdHIgbG9uZykgbWVtY3B5CiA0MzQgY2RlY2wgbWVtbW92ZShwdHIgcHRyIGxvbmcpIG1lbW1vdmUKIDQzNSBjZGVjbCBtZW1zZXQocHRyIGxvbmcgbG9uZykgbWVtc2V0IAotNDM2IHN0dWIgbWt0aW1lCis0MzYgY2RlY2wgbWt0aW1lKHB0cikgbWt0aW1lCiA0Mzcgc3R1YiBtb2RmCiA0Mzggc3R1YiBwZXJyb3IKIDQzOSBjZGVjbCBwb3cobG9uZyBsb25nKSBDUlRETExfcG93CkBAIC00NDksNyArNDQ5LDcgQEAKIDQ0NCBzdHViIHFzb3J0CiA0NDUgc3R1YiByYWlzZQogNDQ2IGNkZWNsIHJhbmQoKSBDUlRETExfcmFuZAotNDQ3IHN0dWIgcmVhbGxvYworNDQ3IGNkZWNsIHJlYWxsb2MocHRyIGxvbmcpIENSVERMTF9yZWFsbG9jCiA0NDggc3R1YiByZW1vdmUKIDQ0OSBzdHViIHJlbmFtZQogNDUwIHN0dWIgcmV3aW5kCkBAIC00NjQsMjcgKzQ2NCwyNyBAQAogNDU5IGNkZWNsIHNxcnQobG9uZykgQ1JURExMX3NxcnQKIDQ2MCBjZGVjbCBzcmFuZChsb25nKSBDUlRETExfc3JhbmQKIDQ2MSBzdHViIHNzY2FuZgotNDYyIGNkZWNsIHN0cmNhdChwdHIgcHRyKSBsc3RyY2F0MzJBCis0NjIgY2RlY2wgc3RyY2F0KHB0ciBwdHIpIHN0cmNhdAogNDYzIGNkZWNsIHN0cmNocihwdHIgbG9uZykgc3RyY2hyCi00NjQgY2RlY2wgc3RyY21wKHB0ciBwdHIpIGxzdHJjbXAzMkEKLTQ2NSBzdHViIHN0cmNvbGwKLTQ2NiBjZGVjbCBzdHJjcHkocHRyIHB0cikgbHN0cmNweTMyQQorNDY0IGNkZWNsIHN0cmNtcChwdHIgcHRyKSBzdHJjbXAKKzQ2NSBjZGVjbCBzdHJjb2xsKHB0ciBwdHIpIHN0cmNvbGwKKzQ2NiBjZGVjbCBzdHJjcHkocHRyIHB0cikgc3RyY3B5CiA0NjcgY2RlY2wgc3RyY3NwbihwdHIgcHRyKSBzdHJjc3BuCiA0Njggc3R1YiBzdHJlcnJvcgotNDY5IHN0dWIgc3RyZnRpbWUKLTQ3MCBjZGVjbCBzdHJsZW4ocHRyKSBsc3RybGVuMzJBCi00NzEgY2RlY2wgc3RybmNhdChwdHIgcHRyIGxvbmcpIGxzdHJjYXRuMzJBCi00NzIgY2RlY2wgc3RybmNtcChwdHIgcHRyIGxvbmcpIGxzdHJuY21wMzJBCi00NzMgY2RlY2wgc3RybmNweShwdHIgcHRyIGxvbmcpIGxzdHJjcHluMzJBCi00NzQgc3R1YiBzdHJwYnJrCi00NzUgc3R1YiBzdHJyY2hyCis0NjkgY2RlY2wgc3RyZnRpbWUocHRyIGxvbmcgcHRyIHB0cikgc3RyZnRpbWUKKzQ3MCBjZGVjbCBzdHJsZW4ocHRyKSBzdHJsZW4KKzQ3MSBjZGVjbCBzdHJuY2F0KHB0ciBwdHIgbG9uZykgc3RybmNhdAorNDcyIGNkZWNsIHN0cm5jbXAocHRyIHB0ciBsb25nKSBzdHJuY21wCis0NzMgY2RlY2wgc3RybmNweShwdHIgcHRyIGxvbmcpIHN0cm5jcHkKKzQ3NCBjZGVjbCBzdHJwYnJrKHB0ciBwdHIpIHN0cnBicmsKKzQ3NSBjZGVjbCBzdHJyY2hyKHB0ciBsb25nKSBzdHJyY2hyCiA0NzYgY2RlY2wgc3Ryc3BuKHB0ciBwdHIpIHN0cnNwbgogNDc3IGNkZWNsIHN0cnN0cihwdHIgcHRyKSBzdHJzdHIKIDQ3OCBzdHViIHN0cnRvZAogNDc5IGNkZWNsIHN0cnRvayhwdHIgcHRyKSBzdHJ0b2sKIDQ4MCBjZGVjbCBzdHJ0b2wocHRyIHB0ciBsb25nKSBzdHJ0b2wKIDQ4MSBjZGVjbCBzdHJ0b3VsKHB0ciBwdHIgbG9uZykgc3RydG91bAotNDgyIHN0dWIgc3RyeGZybQorNDgyIGNkZWNsIHN0cnhmcm0ocHRyIHB0ciBsb25nKSBzdHJ4ZnJtCiA0ODMgc3R1YiBzd3ByaW50ZgogNDg0IHN0dWIgc3dzY2FuZgogNDg1IHN0dWIgc3lzdGVtCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpLnNwZWMgYi9pZjE2MzIvZ2RpLnNwZWMKaW5kZXggNGE4ZTFiNS4uM2ZkNmIxZSAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaS5zcGVjCisrKyBiL2lmMTYzMi9nZGkuc3BlYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAxNjkgc3R1YiBJc0RDRGlydHkKIDE3MCBzdHViIFNldERDU3RhdHVzCiAxNzIgcGFzY2FsMTYgU2V0UmVjdFJnbih3b3JkIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCkgU2V0UmVjdFJnbgotMTczIHBhc2NhbDE2IEdldENsaXBSZ24od29yZCkgR2V0Q2xpcFJnbgorMTczIHBhc2NhbDE2IEdldENsaXBSZ24od29yZCkgR2V0Q2xpcFJnbjE2CiAxNzUgcGFzY2FsMTYgRW51bU1ldGFGaWxlKHdvcmQgd29yZCBzZWdwdHIgbG9uZykgVEhVTktfRW51bU1ldGFGaWxlMTYKIDE3NiBwYXNjYWwxNiBQbGF5TWV0YUZpbGVSZWNvcmQod29yZCBwdHIgcHRyIHdvcmQpIFBsYXlNZXRhRmlsZVJlY29yZAogMTc5IHBhc2NhbDE2IEdldERDU3RhdGUod29yZCkgR2V0RENTdGF0ZQpAQCAtMzgyLDcgKzM4Miw3IEBACiA2MTAgc3R1YiBHRElTaWduYWxQcm9jMzIKIDYxMSBzdHViIEdldFJhbmRvbVJnbgogNjEyIHN0dWIgR2V0VGV4dENoYXJTZXQKLTYxMyBzdHViIEVudW1Gb250RmFtaWxpZXNFeAorNjEzIHBhc2NhbDE2IEVudW1Gb250RmFtaWxpZXNFeCh3b3JkIHB0ciBzZWdwdHIgbG9uZyBsb25nKSBUSFVOS19FbnVtRm9udEZhbWlsaWVzRXgxNgogNjE0IHN0dWIgQWRkTHBrVG9HREkKIDYxNSBzdHViIEdldENoYXJhY3RlclBsYWNlbWVudAogNjE2IHN0dWIgR2V0Rm9udExhbmd1YWdlSW5mbwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaTMyLnNwZWMgYi9pZjE2MzIvZ2RpMzIuc3BlYwppbmRleCA2YzY4NTNlLi5jODRiZjRhIDEwMDY0NAotLS0gYS9pZjE2MzIvZ2RpMzIuc3BlYworKysgYi9pZjE2MzIvZ2RpMzIuc3BlYwpAQCAtODYsMTEgKzg2LDExIEBACiAwMDc4IHN0dWIgRW5kUGF0aAogMDA3OSBzdHViIEVudW1FbmhNZXRhRmlsZQogMDA4MCBzdGRjYWxsIEVudW1Gb250RmFtaWxpZXNBKGxvbmcgcHRyIHB0ciBsb25nKSBUSFVOS19FbnVtRm9udEZhbWlsaWVzMzJBCi0wMDgxIHN0dWIgRW51bUZvbnRGYW1pbGllc0V4QQotMDA4MiBzdHViIEVudW1Gb250RmFtaWxpZXNFeFcKKzAwODEgc3RkY2FsbCBFbnVtRm9udEZhbWlsaWVzRXhBKGxvbmcgcHRyIHB0ciBsb25nIGxvbmcpIFRIVU5LX0VudW1Gb250RmFtaWxpZXNFeDMyQQorMDA4MiBzdGRjYWxsIEVudW1Gb250RmFtaWxpZXNFeFcobG9uZyBwdHIgcHRyIGxvbmcgbG9uZykgVEhVTktfRW51bUZvbnRGYW1pbGllc0V4MzJXCiAwMDgzIHN0ZGNhbGwgRW51bUZvbnRGYW1pbGllc1cobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1Gb250RmFtaWxpZXMzMlcKLTAwODQgc3R1YiBFbnVtRm9udHNBCi0wMDg1IHN0dWIgRW51bUZvbnRzVworMDA4NCBzdGRjYWxsIEVudW1Gb250c0EobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1Gb250czMyQQorMDA4NSBzdGRjYWxsIEVudW1Gb250c1cobG9uZyBwdHIgcHRyIGxvbmcpIFRIVU5LX0VudW1Gb250czMyVwogMDA4NiBzdHViIEVudW1JQ01Qcm9maWxlc0EKIDAwODcgc3R1YiBFbnVtSUNNUHJvZmlsZXNXCiAwMDg4IHN0dWIgRW51bU1ldGFGaWxlCkBAIC0xNTMsNyArMTUzLDcgQEAKIDAxNDUgc3RkY2FsbCBHZXRCa0NvbG9yKGxvbmcpIEdldEJrQ29sb3IKIDAxNDYgc3R1YiBHZXRCa01vZGUKIDAxNDcgc3R1YiBHZXRCb3VuZHNSZWN0Ci0wMTQ4IHN0dWIgR2V0QnJ1c2hPcmdFeAorMDE0OCBzdGRjYWxsIEdldEJydXNoT3JnRXgobG9uZyBwdHIpIEdldEJydXNoT3JnRXgzMgogMDE0OSBzdHViIEdldENoYXJBQkNXaWR0aHNBCiAwMTUwIHN0dWIgR2V0Q2hhckFCQ1dpZHRoc0Zsb2F0QQogMDE1MSBzdHViIEdldENoYXJBQkNXaWR0aHNGbG9hdFcKQEAgLTE2OCwxMiArMTY4LDEyIEBACiAwMTYwIHN0dWIgR2V0Q2hhcmFjdGVyUGxhY2VtZW50QQogMDE2MSBzdHViIEdldENoYXJhY3RlclBsYWNlbWVudFcKIDAxNjIgc3RkY2FsbCBHZXRDbGlwQm94KGxvbmcgcHRyKSBHZXRDbGlwQm94MzIKLTAxNjMgc3R1YiBHZXRDbGlwUmduCiswMTYzIHN0ZGNhbGwgR2V0Q2xpcFJnbihsb25nIGxvbmcpIEdldENsaXBSZ24zMgogMDE2NCBzdHViIEdldENvbG9yQWRqdXN0bWVudAogMDE2NSBzdHViIEdldENvbG9yU3BhY2UKIDAxNjYgc3R1YiBHZXRDdXJyZW50T2JqZWN0Ci0wMTY3IHN0dWIgR2V0Q3VycmVudFBvc2l0aW9uRXgKLTAxNjggc3R1YiBHZXREQ09yZ0V4CiswMTY3IHN0ZGNhbGwgR2V0Q3VycmVudFBvc2l0aW9uRXgobG9uZyBwdHIpIEdldEN1cnJlbnRQb3NpdGlvbkV4MzIKKzAxNjggc3RkY2FsbCBHZXREQ09yZ0V4KGxvbmcgcHRyKSBHZXREQ09yZ0V4CiAwMTY5IHN0dWIgR2V0RElCQ29sb3JUYWJsZQogMDE3MCBzdHViIEdldERJQml0cwogMDE3MSBzdGRjYWxsIEdldERldmljZUNhcHMobG9uZyBsb25nKSBHZXREZXZpY2VDYXBzCkBAIC0yMzksMTYgKzIzOSwxNiBAQAogMDIzMSBzdHViIEdldFRleHRFeHRlbnRQb2ludDMyVwogMDIzMiBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludEEobG9uZyBwdHIgbG9uZyBwdHIpIEdldFRleHRFeHRlbnRQb2ludDMyQQogMDIzMyBzdGRjYWxsIEdldFRleHRFeHRlbnRQb2ludFcobG9uZyBwdHIgbG9uZyBwdHIpIEdldFRleHRFeHRlbnRQb2ludDMyVwotMDIzNCBzdHViIEdldFRleHRGYWNlQQorMDIzNCBzdGRjYWxsIEdldFRleHRGYWNlQShsb25nIGxvbmcgcHRyKSBHZXRUZXh0RmFjZQogMDIzNSBzdHViIEdldFRleHRGYWNlVwogMDIzNiBzdGRjYWxsIEdldFRleHRNZXRyaWNzQShsb25nIHB0cikgR2V0VGV4dE1ldHJpY3MzMkEKIDAyMzcgc3RkY2FsbCBHZXRUZXh0TWV0cmljc1cobG9uZyBwdHIpIEdldFRleHRNZXRyaWNzMzJXCiAwMjM4IHN0dWIgR2V0VHJhbnNmb3JtCi0wMjM5IHN0dWIgR2V0Vmlld3BvcnRFeHRFeAotMDI0MCBzdHViIEdldFZpZXdwb3J0T3JnRXgKKzAyMzkgc3RkY2FsbCBHZXRWaWV3cG9ydEV4dEV4KGxvbmcgcHRyKSBHZXRWaWV3cG9ydEV4dEV4MzIKKzAyNDAgc3RkY2FsbCBHZXRWaWV3cG9ydE9yZ0V4KGxvbmcgcHRyKSBHZXRWaWV3cG9ydE9yZ0V4MzIKIDAyNDEgc3R1YiBHZXRXaW5NZXRhRmlsZUJpdHMKLTAyNDIgc3R1YiBHZXRXaW5kb3dFeHRFeAotMDI0MyBzdHViIEdldFdpbmRvd09yZ0V4CiswMjQyIHN0ZGNhbGwgR2V0V2luZG93RXh0RXgobG9uZyBwdHIpIEdldFdpbmRvd0V4dEV4MzIKKzAyNDMgc3RkY2FsbCBHZXRXaW5kb3dPcmdFeChsb25nIHB0cikgR2V0V2luZG93T3JnRXgzMgogMDI0NCBzdHViIEdldFdvcmxkVHJhbnNmb3JtCiAwMjQ1IHN0ZGNhbGwgSW50ZXJzZWN0Q2xpcFJlY3QobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBJbnRlcnNlY3RDbGlwUmVjdDMyCiAwMjQ2IHN0ZGNhbGwgSW52ZXJ0UmduKGxvbmcgbG9uZykgSW52ZXJ0UmduMzIKQEAgLTMyOCw3ICszMjgsNyBAQAogMDMxOSBzdHViIFNldElDTVByb2ZpbGVBCiAwMzIwIHN0dWIgU2V0SUNNUHJvZmlsZVcKIDAzMjEgc3RkY2FsbCBTZXRNYXBNb2RlKGxvbmcgbG9uZykgU2V0TWFwTW9kZQotMDMyMiBzdHViIFNldE1hcHBlckZsYWdzCiswMzIyIHN0ZGNhbGwgU2V0TWFwcGVyRmxhZ3MobG9uZyBsb25nKSBTZXRNYXBwZXJGbGFncwogMDMyMyBzdHViIFNldE1ldGFGaWxlQml0c0V4CiAwMzI0IHN0dWIgU2V0TWV0YVJnbgogMDMyNSBzdHViIFNldE1pdGVyTGltaXQKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCA5YjJjNGM5Li5lYjNmZDI5IDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC01Myw5ICs1Myw5IEBACiA1NCAgcGFzY2FsMTYgR2V0SW5zdGFuY2VEYXRhKHdvcmQgd29yZCB3b3JkKSBHZXRJbnN0YW5jZURhdGEKIDU1ICBwYXNjYWwxNiBDYXRjaChwdHIpIENhdGNoIAogNTYgIHBhc2NhbDE2IFRocm93KHB0ciB3b3JkKSBUaHJvdwotNTcgIHBhc2NhbDE2IEdldFByb2ZpbGVJbnQocHRyIHB0ciBzX3dvcmQpIEdldFByb2ZpbGVJbnQKLTU4ICBwYXNjYWwxNiBHZXRQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0ciB3b3JkKSBHZXRQcm9maWxlU3RyaW5nCi01OSAgcGFzY2FsMTYgV3JpdGVQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyKSBXcml0ZVByb2ZpbGVTdHJpbmcKKzU3ICBwYXNjYWwxNiBHZXRQcm9maWxlSW50KHB0ciBwdHIgc193b3JkKSBHZXRQcm9maWxlSW50MTYKKzU4ICBwYXNjYWwxNiBHZXRQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0ciB3b3JkKSBHZXRQcm9maWxlU3RyaW5nMTYKKzU5ICBwYXNjYWwxNiBXcml0ZVByb2ZpbGVTdHJpbmcocHRyIHB0ciBwdHIpIFdyaXRlUHJvZmlsZVN0cmluZzE2CiA2MCAgcGFzY2FsMTYgRmluZFJlc291cmNlKHdvcmQgc2VncHRyIHNlZ3B0cikgRmluZFJlc291cmNlMTYKIDYxICBwYXNjYWwxNiBMb2FkUmVzb3VyY2Uod29yZCB3b3JkKSBMb2FkUmVzb3VyY2UxNgogNjIgIHBhc2NhbCBMb2NrUmVzb3VyY2Uod29yZCkgV0lOMTZfTG9ja1Jlc291cmNlMTYKQEAgLTEyMywxMSArMTIzLDExIEBACiAxMjQgcmV0dXJuIEVuYWJsZUtlcm5lbCAwIDAKIDEyNSByZXR1cm4gRGlzYWJsZUtlcm5lbCAwIDAKIDEyNiBzdHViIE1lbW9yeUZyZWVkCi0xMjcgcGFzY2FsMTYgR2V0UHJpdmF0ZVByb2ZpbGVJbnQocHRyIHB0ciBzX3dvcmQgcHRyKSBHZXRQcml2YXRlUHJvZmlsZUludAorMTI3IHBhc2NhbDE2IEdldFByaXZhdGVQcm9maWxlSW50KHB0ciBwdHIgc193b3JkIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVJbnQxNgogMTI4IHBhc2NhbDE2IEdldFByaXZhdGVQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0ciB3b3JkIHB0cikKLSAgICAgICAgICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZworICAgICAgICAgICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMTYKIDEyOSBwYXNjYWwxNiBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nKHB0ciBwdHIgcHRyIHB0cikKLSAgICAgICAgICAgICBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nCisgICAgICAgICAgICAgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzE2CiAxMzAgcGFzY2FsIEZpbGVDRFIocHRyKSBGaWxlQ0RSCiAxMzEgcGFzY2FsIEdldERPU0Vudmlyb25tZW50KCkgR2V0RE9TRW52aXJvbm1lbnQKIDEzMiBwYXNjYWwgR2V0V2luRmxhZ3MoKSBHZXRXaW5GbGFncwpkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMgYi9pZjE2MzIva2VybmVsMzIuc3BlYwppbmRleCBlY2Y2MDIwLi45Yzc1MDFlIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsMzIuc3BlYworKysgYi9pZjE2MzIva2VybmVsMzIuc3BlYwpAQCAtOTYsOCArOTYsOCBAQAogMDA5MSBzdHViIEVudW1SZXNvdXJjZVR5cGVzVwogMDA5MiBzdGRjYWxsIEVudW1TeXN0ZW1Db2RlUGFnZXNBKHB0ciBsb25nKSBUSFVOS19FbnVtU3lzdGVtQ29kZVBhZ2VzMzJBCiAwMDkzIHN0ZGNhbGwgRW51bVN5c3RlbUNvZGVQYWdlc1cocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Db2RlUGFnZXMzMlcKLTAwOTQgc3R1YiBFbnVtU3lzdGVtTG9jYWxlc0EKLTAwOTUgc3R1YiBFbnVtU3lzdGVtTG9jYWxlc1cKKzAwOTQgc3RkY2FsbCBFbnVtU3lzdGVtTG9jYWxlc0EocHRyIGxvbmcpIFRIVU5LX0VudW1TeXN0ZW1Mb2NhbGVzMzJBCiswMDk1IHN0ZGNhbGwgRW51bVN5c3RlbUxvY2FsZXNXKHB0ciBsb25nKSBUSFVOS19FbnVtU3lzdGVtTG9jYWxlczMyVwogMDA5NiBzdHViIEVudW1UaW1lRm9ybWF0c0EKIDAwOTcgc3R1YiBFbnVtVGltZUZvcm1hdHNXCiAwMDk4IHN0dWIgRXJhc2VUYXBlCkBAIC0yNTMsMTIgKzI1MywxMiBAQAogMDI0OCAgICBzdGRjYWxsIEdldE9FTUNQKCkgR2V0T0VNQ1AKIDAyNDkgc3R1YiBHZXRPdmVybGFwcGVkUmVzdWx0CiAwMjUwIHN0dWIgR2V0UHJpb3JpdHlDbGFzcwotMDI1MSBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlSW50QShwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZUludAotMDI1MiBzdHViIEdldFByaXZhdGVQcm9maWxlSW50VworMDI1MSBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlSW50QShwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZUludDMyQQorMDI1MiBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlSW50VyhwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZUludDMyVwogMDI1MyBzdHViIEdldFByaXZhdGVQcm9maWxlU2VjdGlvbkEKIDAyNTQgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25XCi0wMjU1IHN0ZGNhbGwgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcKLTAyNTYgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVN0cmluZ1cKKzAyNTUgc3RkY2FsbCBHZXRQcml2YXRlUHJvZmlsZVN0cmluZ0EocHRyIHB0ciBwdHIgcHRyIGxvbmcgcHRyKSBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQQorMDI1NiBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlU3RyaW5nVyhwdHIgcHRyIHB0ciBwdHIgbG9uZyBwdHIpIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJXCiAwMjU3IHN0ZGNhbGwgR2V0UHJvY0FkZHJlc3MobG9uZyBwdHIpIEdldFByb2NBZGRyZXNzMzIKIDAyNTggc3RkY2FsbCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKGxvbmcgcHRyIHB0cikJR2V0UHJvY2Vzc0FmZmluaXR5TWFzawogMDI1OSBzdGRjYWxsIEdldFByb2Nlc3NIZWFwKCkgR2V0UHJvY2Vzc0hlYXAKQEAgLTI2NiwxMiArMjY2LDEyIEBACiAwMjYxIHN0dWIgR2V0UHJvY2Vzc1NodXRkb3duUGFyYW1ldGVycwogMDI2MiBzdHViIEdldFByb2Nlc3NUaW1lcwogMDI2MyBzdHViIEdldFByb2Nlc3NXb3JraW5nU2V0U2l6ZQotMDI2NCAJc3RkY2FsbCBHZXRQcm9maWxlSW50QShwdHIgcHRyIGxvbmcpIEdldFByb2ZpbGVJbnQKLTAyNjUgc3R1YiBHZXRQcm9maWxlSW50VworMDI2NCBzdGRjYWxsIEdldFByb2ZpbGVJbnRBKHB0ciBwdHIgbG9uZykgR2V0UHJvZmlsZUludDMyQQorMDI2NSBzdGRjYWxsIEdldFByb2ZpbGVJbnRXKHB0ciBwdHIgbG9uZykgR2V0UHJvZmlsZUludDMyVwogMDI2NiBzdHViIEdldFByb2ZpbGVTZWN0aW9uQQogMDI2NyBzdHViIEdldFByb2ZpbGVTZWN0aW9uVwotMDI2OCBzdGRjYWxsIEdldFByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRQcm9maWxlU3RyaW5nCi0wMjY5IHN0dWIgR2V0UHJvZmlsZVN0cmluZ1cKKzAyNjggc3RkY2FsbCBHZXRQcm9maWxlU3RyaW5nQShwdHIgcHRyIHB0ciBwdHIgbG9uZykgR2V0UHJvZmlsZVN0cmluZzMyQQorMDI2OSBzdGRjYWxsIEdldFByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0ciBsb25nKSBHZXRQcm9maWxlU3RyaW5nMzJXCiAwMjcwIHN0dWIgR2V0UXVldWVkQ29tcGxldGlvblN0YXR1cwogMDI3MSBzdGRjYWxsIEdldFNob3J0UGF0aE5hbWVBKHB0ciBwdHIgbG9uZykgR2V0U2hvcnRQYXRoTmFtZTMyQQogMDI3MiBzdGRjYWxsIEdldFNob3J0UGF0aE5hbWVXKHB0ciBwdHIgbG9uZykgR2V0U2hvcnRQYXRoTmFtZTMyVwpAQCAtNTQyLDcgKzU0Miw3IEBACiAwNTM3ICAgIHN0ZGNhbGwgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiAwNTM4IHN0dWIgVW5sb2NrRmlsZQogMDUzOSBzdHViIFVubG9ja0ZpbGVFeAotMDU0MCBzdHViIFVubWFwVmlld09mRmlsZQorMDU0MCBzdGRjYWxsIFVubWFwVmlld09mRmlsZShwdHIpIFVubWFwVmlld09mRmlsZQogMDU0MSBzdHViIFVwZGF0ZVJlc291cmNlQQogMDU0MiBzdHViIFVwZGF0ZVJlc291cmNlVwogMDU0MyBzdHViIFZETUNvbnNvbGVPcGVyYXRpb24KQEAgLTU4NCwxMyArNTg0LDEzIEBACiAwNTc5IHN0dWIgV3JpdGVGaWxlRXgKIDA1ODAgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbkEKIDA1ODEgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvblcKLTA1ODIgc3RkY2FsbCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nQShwdHIgcHRyIHB0ciBwdHIpCVdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcKLTA1ODMgc3R1YiBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nVworMDU4MiBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyIHB0cikgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyQQorMDU4MyBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdXKHB0ciBwdHIgcHRyIHB0cikgV3JpdGVQcml2YXRlUHJvZmlsZVN0cmluZzMyVwogMDU4NCBzdHViIFdyaXRlUHJvY2Vzc01lbW9yeQogMDU4NSBzdHViIFdyaXRlUHJvZmlsZVNlY3Rpb25BCiAwNTg2IHN0dWIgV3JpdGVQcm9maWxlU2VjdGlvblcKLTA1ODcgc3RkY2FsbCBXcml0ZVByb2ZpbGVTdHJpbmdBKHB0ciBwdHIgcHRyKQlXcml0ZVByb2ZpbGVTdHJpbmcKLTA1ODggc3R1YiBXcml0ZVByb2ZpbGVTdHJpbmdXCiswNTg3IHN0ZGNhbGwgV3JpdGVQcm9maWxlU3RyaW5nQShwdHIgcHRyIHB0cikgV3JpdGVQcm9maWxlU3RyaW5nMzJBCiswNTg4IHN0ZGNhbGwgV3JpdGVQcm9maWxlU3RyaW5nVyhwdHIgcHRyIHB0cikgV3JpdGVQcm9maWxlU3RyaW5nMzJXCiAwNTg5IHN0dWIgV3JpdGVUYXBlbWFyawogMDU5MCBzdGRjYWxsIF9ocmVhZChsb25nIHB0ciBsb25nKSBfaHJlYWQKIDA1OTEgc3RkY2FsbCBfaHdyaXRlKGxvbmcgcHRyIGxvbmcpIF9od3JpdGUKZGlmZiAtLWdpdCBhL2lmMTYzMi90aHVuay5jIGIvaWYxNjMyL3RodW5rLmMKaW5kZXggMzQ4NjA2Zi4uNWRhMzk4MiAxMDA2NDQKLS0tIGEvaWYxNjMyL3RodW5rLmMKKysrIGIvaWYxNjMyL3RodW5rLmMKQEAgLTExNyw5ICsxMTcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBGT05URU5VTVBST0MxNiBmdW5jLCBMUEFSQU0gbFBhcmFtICkKIHsKICAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMTZfd29yZF9sbHdsICk7Ci0gICAgcmV0dXJuIEVudW1Gb250cyggaGRjLCBscEZhY2VOYW1lLCAoRk9OVEVOVU1QUk9DMTYpJnRodW5rLCBsUGFyYW0gKTsKKyAgICByZXR1cm4gRW51bUZvbnRzMTYoIGhkYywgbHBGYWNlTmFtZSwgKEZPTlRFTlVNUFJPQzE2KSZ0aHVuaywgbFBhcmFtICk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bUZvbnRzMzJBICAgKEdESTMyLjg0KQorICovCitJTlQzMiBUSFVOS19FbnVtRm9udHMzMkEoIEhEQzMyIGhkYywgTFBDU1RSIGxwRmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTlRFTlVNUFJPQzMyQSBmdW5jLCBMUEFSQU0gbFBhcmFtICkKK3sKKyAgICBERUNMX1RIVU5LKCB0aHVuaywgZnVuYywgQ2FsbFRvMzJfNCApOworICAgIHJldHVybiBFbnVtRm9udHMzMkEoIGhkYywgbHBGYWNlTmFtZSwgKEZPTlRFTlVNUFJPQzMyQSkmdGh1bmssIGxQYXJhbSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1Gb250czMyVyAgIChHREkzMi44NSkKKyAqLworSU5UMzIgVEhVTktfRW51bUZvbnRzMzJXKCBIREMzMiBoZGMsIExQQ1dTVFIgbHBGYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRk9OVEVOVU1QUk9DMzJXIGZ1bmMsIExQQVJBTSBsUGFyYW0gKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl80ICk7CisgICAgcmV0dXJuIEVudW1Gb250czMyVyggaGRjLCBscEZhY2VOYW1lLCAoRk9OVEVOVU1QUk9DMzJXKSZ0aHVuaywgbFBhcmFtICk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUSFVOS19FbnVtTWV0YUZpbGUxNiAgIChHREkuMTc1KQpAQCAtMTY0LDYgKzE4Myw0NCBAQAogICAgIHJldHVybiBFbnVtRm9udEZhbWlsaWVzMzJXKGhkYyxscHN6RmFtaWx5LChGT05URU5VTVBST0MzMlcpJnRodW5rLGxQYXJhbSk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bUZvbnRGYW1pbGllc0V4MTYgICAoR0RJLjYxMykKKyAqLworSU5UMTYgVEhVTktfRW51bUZvbnRGYW1pbGllc0V4MTYoIEhEQzE2IGhkYywgTFBMT0dGT05UMTYgbHBMRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT05URU5VTVBST0NFWDE2IGZ1bmMsIExQQVJBTSBsUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgcmVzZXJ2ZWQgKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8xNl93b3JkX2xsd2wgKTsKKyAgICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MTYoIGhkYywgbHBMRiwgKEZPTlRFTlVNUFJPQ0VYMTYpJnRodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFBhcmFtLCByZXNlcnZlZCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEhVTktfRW51bUZvbnRGYW1pbGllc0V4MzJBICAgKEdESTMyLjgxKQorICovCitJTlQzMiBUSFVOS19FbnVtRm9udEZhbWlsaWVzRXgzMkEoIEhEQzMyIGhkYywgTFBMT0dGT05UMzJBIGxwTEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTlRFTlVNUFJPQ0VYMzJBIGZ1bmMsIExQQVJBTSBsUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHJlc2VydmVkKQoreworICAgIERFQ0xfVEhVTksoIHRodW5rLCBmdW5jLCBDYWxsVG8zMl80ICk7CisgICAgcmV0dXJuIEVudW1Gb250RmFtaWxpZXNFeDMyQSggaGRjLCBscExGLCAoRk9OVEVOVU1QUk9DRVgzMkEpJnRodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxQYXJhbSwgcmVzZXJ2ZWQgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1Gb250RmFtaWxpZXNFeDMyVyAgIChHREkzMi44MikKKyAqLworSU5UMzIgVEhVTktfRW51bUZvbnRGYW1pbGllc0V4MzJXKCBIREMzMiBoZGMsIExQTE9HRk9OVDMyVyBscExGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT05URU5VTVBST0NFWDMyVyBmdW5jLCBMUEFSQU0gbFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCByZXNlcnZlZCApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzQgKTsKKyAgICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MzJXKCBoZGMsIGxwTEYsIChGT05URU5VTVBST0NFWDMyVykmdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFBhcmFtLCByZXNlcnZlZCApOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVEhVTktfTGluZUREQTE2ICAgKEdESS4xMDApCkBAIC0zMjAsNiArMzc3LDI1IEBACiAgICAgcmV0dXJuIEVudW1TeXN0ZW1Db2RlUGFnZXMzMlcoIChDT0RFUEFHRV9FTlVNUFJPQzMyVykmdGh1bmssIGZsYWdzICk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1TeXN0ZW1Mb2NhbGVzMzJBICAgKEtFUk5FTDMyLjkyKQorICovCitCT09MMzIgVEhVTktfRW51bVN5c3RlbUxvY2FsZXMzMkEoIExPQ0FMRV9FTlVNUFJPQzMyQSBmdW5jLCBEV09SRCBmbGFncyApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzEgKTsKKyAgICByZXR1cm4gRW51bVN5c3RlbUxvY2FsZXMzMkEoIChMT0NBTEVfRU5VTVBST0MzMkEpJnRodW5rLCBmbGFncyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFRIVU5LX0VudW1TeXN0ZW1Mb2NhbGVzMzJXICAgKEtFUk5FTDMyLjkzKQorICovCitCT09MMzIgVEhVTktfRW51bVN5c3RlbUxvY2FsZXMzMlcoIExPQ0FMRV9FTlVNUFJPQzMyVyBmdW5jLCBEV09SRCBmbGFncyApCit7CisgICAgREVDTF9USFVOSyggdGh1bmssIGZ1bmMsIENhbGxUbzMyXzEgKTsKKyAgICByZXR1cm4gRW51bVN5c3RlbUxvY2FsZXMzMlcoIChMT0NBTEVfRU5VTVBST0MzMlcpJnRodW5rLCBmbGFncyApOworfQorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRIVU5LX0dyYXlTdHJpbmcxNiAgIChVU0VSLjE4NSkKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyLnNwZWMgYi9pZjE2MzIvdXNlci5zcGVjCmluZGV4IDJjYTlhYmYuLjIwYWI4NDcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi91c2VyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIuc3BlYwpAQCAtOTksNyArOTksNyBAQAogOTcgIHBhc2NhbDE2IENoZWNrRGxnQnV0dG9uKHdvcmQgd29yZCB3b3JkKSBDaGVja0RsZ0J1dHRvbgogOTggIHBhc2NhbDE2IElzRGxnQnV0dG9uQ2hlY2tlZCh3b3JkIHdvcmQpIElzRGxnQnV0dG9uQ2hlY2tlZAogOTkgIHBhc2NhbDE2IERsZ0RpclNlbGVjdCh3b3JkIHB0ciB3b3JkKSBEbGdEaXJTZWxlY3QKLTEwMCBwYXNjYWwxNiBEbGdEaXJMaXN0KHdvcmQgc2VncHRyIHdvcmQgd29yZCB3b3JkKSBEbGdEaXJMaXN0CisxMDAgcGFzY2FsMTYgRGxnRGlyTGlzdCh3b3JkIHB0ciB3b3JkIHdvcmQgd29yZCkgRGxnRGlyTGlzdDE2CiAxMDEgcGFzY2FsICAgU2VuZERsZ0l0ZW1NZXNzYWdlKHdvcmQgd29yZCB3b3JkIHdvcmQgbG9uZykgU2VuZERsZ0l0ZW1NZXNzYWdlMTYKIDEwMiBwYXNjYWwxNiBBZGp1c3RXaW5kb3dSZWN0KHB0ciBsb25nIHdvcmQpIEFkanVzdFdpbmRvd1JlY3QxNgogMTAzIHBhc2NhbDE2IE1hcERpYWxvZ1JlY3Qod29yZCBwdHIpIE1hcERpYWxvZ1JlY3QxNgpAQCAtMTk0LDcgKzE5NCw3IEBACiAxOTIgcGFzY2FsMTYgSW5TZW5kTWVzc2FnZSgpIEluU2VuZE1lc3NhZ2UKIDE5MyBwYXNjYWwxNiBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZSh3b3JkKSBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZQogMTk0IHBhc2NhbDE2IERsZ0RpclNlbGVjdENvbWJvQm94KHdvcmQgcHRyIHdvcmQpIERsZ0RpclNlbGVjdENvbWJvQm94Ci0xOTUgcGFzY2FsMTYgRGxnRGlyTGlzdENvbWJvQm94KHdvcmQgc2VncHRyIHdvcmQgd29yZCB3b3JkKSBEbGdEaXJMaXN0Q29tYm9Cb3gxNgorMTk1IHBhc2NhbDE2IERsZ0Rpckxpc3RDb21ib0JveCh3b3JkIHB0ciB3b3JkIHdvcmQgd29yZCkgRGxnRGlyTGlzdENvbWJvQm94MTYKIDE5NiBwYXNjYWwgICBUYWJiZWRUZXh0T3V0KHdvcmQgc193b3JkIHNfd29yZCBwdHIgc193b3JkIHNfd29yZCBwdHIgc193b3JkKQogICAgICAgICAgICAgIFRhYmJlZFRleHRPdXQKIDE5NyBwYXNjYWwgICBHZXRUYWJiZWRUZXh0RXh0ZW50KHdvcmQgcHRyIHdvcmQgd29yZCBwdHIpIEdldFRhYmJlZFRleHRFeHRlbnQKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCA3YTQ4NGJhLi5lNGM4NzFkIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC04Miw3ICs4Miw3IEBACiAwMDc3IHN0dWIgQ3JlYXRlSWNvbkluZGlyZWN0CiAwMDc4IHN0dWIgQ3JlYXRlTURJV2luZG93QQogMDA3OSBzdHViIENyZWF0ZU1ESVdpbmRvd1cKLTAwODAgc3R1YiBDcmVhdGVNZW51CiswMDgwIHN0ZGNhbGwgQ3JlYXRlTWVudSgpIENyZWF0ZU1lbnUKIDAwODEgc3RkY2FsbCBDcmVhdGVQb3B1cE1lbnUoKSBDcmVhdGVQb3B1cE1lbnUKIDAwODIgc3RkY2FsbCBDcmVhdGVXaW5kb3dFeEEobG9uZyBwdHIgcHRyIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyAKIAkJCQlsb25nIGxvbmcgbG9uZyBwdHIpIENyZWF0ZVdpbmRvd0V4MzJBCkBAIC0xNDYsMTAgKzE0NiwxMCBAQAogMDEzOSBzdGRjYWxsIERpYWxvZ0JveFBhcmFtVyhsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEaWFsb2dCb3hQYXJhbTMyVwogMDE0MCBzdGRjYWxsIERpc3BhdGNoTWVzc2FnZUEocHRyKSBVU0VSMzJfRGlzcGF0Y2hNZXNzYWdlQQogMDE0MSBzdGRjYWxsIERpc3BhdGNoTWVzc2FnZVcocHRyKSBVU0VSMzJfRGlzcGF0Y2hNZXNzYWdlQQotMDE0MiBzdHViIERsZ0Rpckxpc3RBCiswMTQyIHN0ZGNhbGwgRGxnRGlyTGlzdEEobG9uZyBwdHIgbG9uZyBsb25nIGxvbmcpIERsZ0Rpckxpc3QzMkEKIDAxNDMgc3RkY2FsbCBEbGdEaXJMaXN0Q29tYm9Cb3hBKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBEbGdEaXJMaXN0Q29tYm9Cb3gzMkEKIDAxNDQgc3RkY2FsbCBEbGdEaXJMaXN0Q29tYm9Cb3hXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBEbGdEaXJMaXN0Q29tYm9Cb3gzMlcKLTAxNDUgc3R1YiBEbGdEaXJMaXN0VworMDE0NSBzdGRjYWxsIERsZ0Rpckxpc3RXKGxvbmcgcHRyIGxvbmcgbG9uZyBsb25nKSBEbGdEaXJMaXN0MzJXCiAwMTQ2IHN0ZGNhbGwgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeEEobG9uZyBwdHIgbG9uZyBsb25nKSBEbGdEaXJTZWxlY3RDb21ib0JveEV4MzJBCiAwMTQ3IHN0ZGNhbGwgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeFcobG9uZyBwdHIgbG9uZyBsb25nKSBEbGdEaXJTZWxlY3RDb21ib0JveEV4MzJXCiAwMTQ4IHN0ZGNhbGwgRGxnRGlyU2VsZWN0RXhBKGxvbmcgcHRyIGxvbmcgbG9uZykgRGxnRGlyU2VsZWN0RXgzMkEKQEAgLTQ2Niw3ICs0NjYsNyBAQAogMDQ1OSBzdHViIFNlbmROb3RpZnlNZXNzYWdlQQogMDQ2MCBzdHViIFNlbmROb3RpZnlNZXNzYWdlVwogMDQ2MSBzdHViIFNlcnZlclNldEZ1bmN0aW9uUG9pbnRlcnMKLTA0NjIgc3R1YiBTZXRBY3RpdmVXaW5kb3cKKzA0NjIgc3RkY2FsbCBTZXRBY3RpdmVXaW5kb3cobG9uZykgU2V0QWN0aXZlV2luZG93CiAwNDYzIHN0ZGNhbGwgU2V0Q2FwdHVyZShsb25nKSBTZXRDYXB0dXJlMzIKIDA0NjQgc3RkY2FsbCBTZXRDYXJldEJsaW5rVGltZShsb25nKSBTZXRDYXJldEJsaW5rVGltZQogMDQ2NSBzdGRjYWxsIFNldENhcmV0UG9zKGxvbmcgbG9uZykgU2V0Q2FyZXRQb3MKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5nLnNwZWMgYi9pZjE2MzIvd2luZy5zcGVjCmluZGV4IGVjMWFiNDMuLmYyMjEyMmUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5nLnNwZWMKKysrIGIvaWYxNjMyL3dpbmcuc3BlYwpAQCAtMSwxNSArMSwxNiBAQAogbmFtZSAgICB3aW5nCiB0eXBlICAgIHdpbjE2CiAKLTEwMDEgc3R1YiBXSU5HQ1JFQVRFREMKLTEwMDIgc3R1YiBXSU5HUkVDT01NRU5ERElCRk9STUFUCi0xMDAzIHN0dWIgV0lOR0NSRUFURUJJVE1BUAorMTAwMSBwYXNjYWwxNiBXaW5HQ3JlYXRlREMoKSBXaW5HQ3JlYXRlREMxNgorMTAwMiBwYXNjYWwxNiBXaW5HUmVjb21tZW5kRElCRm9ybWF0KHB0cikgV2luR1JlY29tbWVuZERJQkZvcm1hdDE2CisxMDAzIHBhc2NhbDE2IFdpbkdDcmVhdGVCaXRtYXAod29yZCBwdHIgcHRyKSBXaW5HQ3JlYXRlQml0bWFwMTYKIDEwMDQgc3R1YiBXSU5HR0VURElCUE9JTlRFUgogMTAwNSBzdHViIFdJTkdHRVRESUJDT0xPUlRBQkxFCiAxMDA2IHN0dWIgV0lOR1NFVERJQkNPTE9SVEFCTEUKLTEwMDcgc3R1YiBXSU5HQ1JFQVRFSEFMRlRPTkVQQUxFVFRFCi0xMDA4IHN0dWIgV0lOR0NSRUFURUhBTEZUT05FQlJVU0gKKzEwMDcgcGFzY2FsMTYgV2luR0NyZWF0ZUhhbGZUb25lUGFsZXR0ZSgpIFdpbkdDcmVhdGVIYWxmVG9uZVBhbGV0dGUxNgorMTAwOCBwYXNjYWwxNiBXaW5HQ3JlYXRlSGFsZlRvbmVCcnVzaCh3b3JkIGxvbmcgd29yZCkgV2luR0NyZWF0ZUhhbGZUb25lQnJ1c2gxNgogMTAwOSBzdHViIFdJTkdTVFJFVENIQkxUCisjIFByb2JhYmx5IG11Y2ggbGlrZSBCaXRCbHQxNi4uLiBidXQsIHdpdGhvdXQgdGhlIGxhc3QgZmllbGQgKHdoYXQgdmFsdWU/KQogMTAxMCBzdHViIFdJTkdCSVRCTFQKIAogIyBTZWVtIHRoYXQgMTI5OSBpcyB0aGUgbGltaXQuLi4gd2VpcmQuLi4KZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5tbS5zcGVjIGIvaWYxNjMyL3dpbm1tLnNwZWMKaW5kZXggNTcwNzgwMy4uNDRhMDY5MSAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbm1tLnNwZWMKKysrIGIvaWYxNjMyL3dpbm1tLnNwZWMKQEAgLTEzOSw3ICsxMzksNyBAQAogMDEzOCBzdHViIHRpbWVFbmRQZXJpb2QKIDAxMzkgc3R1YiB0aW1lR2V0RGV2Q2FwcwogMDE0MCBzdHViIHRpbWVHZXRTeXN0ZW1UaW1lCi0wMTQxIHN0dWIgdGltZUdldFRpbWUKKzAxNDEgc3RkY2FsbCB0aW1lR2V0VGltZSgpIHRpbWVHZXRUaW1lCiAwMTQyIHN0dWIgdGltZUtpbGxFdmVudAogMDE0MyBzdHViIHRpbWVTZXRFdmVudAogMDE0NCBzdHViIHdhdmVJbkFkZEJ1ZmZlcgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbnNvY2suc3BlYyBiL2lmMTYzMi93aW5zb2NrLnNwZWMKaW5kZXggNTA0OGY4My4uMjRkMmZjMCAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnNvY2suc3BlYworKysgYi9pZjE2MzIvd2luc29jay5zcGVjCkBAIC0zNywxNyArMzcsMTcgQEAKIDU2ICBwYXNjYWwgICBnZXRzZXJ2Ynlwb3J0KHdvcmQgcHRyKSBXSU5TT0NLX2dldHNlcnZieXBvcnQKIDU3ICBwYXNjYWwgICBnZXRob3N0bmFtZShwdHIgd29yZCkgV0lOU09DS19nZXRob3N0bmFtZQogMTAxIHBhc2NhbDE2IFdTQUFzeW5jU2VsZWN0KHdvcmQgd29yZCB3b3JkIGxvbmcpIFdTQUFzeW5jU2VsZWN0Ci0xMDIgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKHdvcmQgd29yZCBwdHIgd29yZCB3b3JkIHB0ciB3b3JkKQorMTAyIHBhc2NhbDE2IFdTQUFzeW5jR2V0SG9zdEJ5QWRkcih3b3JkIHdvcmQgcHRyIHdvcmQgd29yZCBzZWdwdHIgd29yZCkKICAgICAgICAgICAgICBXU0FBc3luY0dldEhvc3RCeUFkZHIKLTEwMyBwYXNjYWwxNiBXU0FBc3luY0dldEhvc3RCeU5hbWUod29yZCB3b3JkIHB0ciBwdHIgd29yZCkKKzEwMyBwYXNjYWwxNiBXU0FBc3luY0dldEhvc3RCeU5hbWUod29yZCB3b3JkIHB0ciBzZWdwdHIgd29yZCkKICAgICAgICAgICAgICBXU0FBc3luY0dldEhvc3RCeU5hbWUKLTEwNCBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIod29yZCB3b3JkIHdvcmQgcHRyIHdvcmQpCisxMDQgcGFzY2FsMTYgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyKHdvcmQgd29yZCB3b3JkIHNlZ3B0ciB3b3JkKQogICAgICAgICAgICAgIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcgotMTA1IHBhc2NhbDE2IFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUod29yZCB3b3JkIHB0ciBwdHIgd29yZCkKKzEwNSBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOYW1lKHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCiAgICAgICAgICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TmFtZQotMTA2IHBhc2NhbDE2IFdTQUFzeW5jR2V0U2VydkJ5UG9ydCh3b3JkIHdvcmQgd29yZCBwdHIgcHRyIHdvcmQpCisxMDYgcGFzY2FsMTYgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0KHdvcmQgd29yZCB3b3JkIHB0ciBzZWdwdHIgd29yZCkKICAgICAgICAgICAgICBXU0FBc3luY0dldFNlcnZCeVBvcnQKLTEwNyBwYXNjYWwxNiBXU0FBc3luY0dldFNlcnZCeU5hbWUod29yZCB3b3JkIHB0ciBwdHIgcHRyIHdvcmQpCisxMDcgcGFzY2FsMTYgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKHdvcmQgd29yZCBwdHIgcHRyIHNlZ3B0ciB3b3JkKQogICAgICAgICAgICAgIFdTQUFzeW5jR2V0U2VydkJ5TmFtZQogMTA4IHBhc2NhbDE2IFdTQUNhbmNlbEFzeW5jUmVxdWVzdCh3b3JkKSBXU0FDYW5jZWxBc3luY1JlcXVlc3QKIDEwOSBwYXNjYWwxNiBXU0FTZXRCbG9ja2luZ0hvb2soKSBXU0FTZXRCbG9ja2luZ0hvb2sKQEAgLTU4LDQgKzU4LDQgQEAKIDExNCBwYXNjYWwxNiBXU0FJc0Jsb2NraW5nKCkgV1NBSXNCbG9ja2luZwogMTE1IHBhc2NhbCAgIFdTQVN0YXJ0dXAod29yZCBwdHIpIFdTQVN0YXJ0dXAKIDExNiBwYXNjYWwgICBXU0FDbGVhbnVwKCkgV1NBQ2xlYW51cAotMTUxIHBhc2NhbDE2IF9fV1NBRkRJc1NldCh3b3JkIHB0cikgV1NBRkRJc1NldAorMTUxIHBhc2NhbDE2IF9fV1NBRkRJc1NldCh3b3JkIHB0cikgX19XU0FGRElzU2V0CmRpZmYgLS1naXQgYS9pZjE2MzIvd3Byb2NzLnNwZWMgYi9pZjE2MzIvd3Byb2NzLnNwZWMKaW5kZXggMDdkNjNlNy4uMzUyMmZlYyAxMDA2NDQKLS0tIGEvaWYxNjMyL3dwcm9jcy5zcGVjCisrKyBiL2lmMTYzMi93cHJvY3Muc3BlYwpAQCAtNCw3ICs0LDYgQEAKIDEgIHBhc2NhbCBXSU5QUk9DX0NhbGxQcm9jMTZUbzMyQSh3b3JkIHdvcmQgd29yZCBsb25nIGxvbmcpIFdJTlBST0NfQ2FsbFByb2MxNlRvMzJBCiAyICBwYXNjYWwgU3RhdGljV25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBTdGF0aWNXbmRQcm9jCiAzICBwYXNjYWwgU2Nyb2xsQmFyV25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBTY3JvbGxCYXJXbmRQcm9jCi00ICBwYXNjYWwgTGlzdEJveFduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgTGlzdEJveFduZFByb2MKIDUgIHBhc2NhbCBDb21ib0JveFduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgQ29tYm9Cb3hXbmRQcm9jCiA2ICBwYXNjYWwgRWRpdFduZFByb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRWRpdFduZFByb2MKIDcgIHBhc2NhbCBQb3B1cE1lbnVXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIFBvcHVwTWVudVduZFByb2MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlnLmguaW4gYi9pbmNsdWRlL2NvbmZpZy5oLmluCmluZGV4IDYzODY1MmEuLmNmMDBkMjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY29uZmlnLmguaW4KKysrIGIvaW5jbHVkZS9jb25maWcuaC5pbgpAQCAtMyw5ICszLDYgQEAKIC8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KICN1bmRlZiBjb25zdAogCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KIC8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwogI3VuZGVmIHNpemVfdAogCkBAIC0xNSw2ICsxMiw5IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwogI3VuZGVmIFNURENfSEVBREVSUwogCisvKiBEZWZpbmUgaWYgdGhlIFggV2luZG93IFN5c3RlbSBpcyBtaXNzaW5nIG9yIG5vdCBiZWluZyB1c2VkLiAgKi8KKyN1bmRlZiBYX0RJU1BMQVlfTUlTU0lORworCiAvKiBEZWZpbmUgaWYgc3ltYm9scyBkZWNsYXJlZCBpbiBhc3NlbWJseSBjb2RlIG5lZWQgYW4gdW5kZXJzY29yZSBwcmVmaXggKi8KICN1bmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGNlLmggYi9pbmNsdWRlL2RjZS5oCmluZGV4IDA2ZmYwNjIuLmIyMWVjMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGNlLmgKKysrIGIvaW5jbHVkZS9kY2UuaApAQCAtOCw2ICs4LDcgQEAKICNkZWZpbmUgRENFX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKIAogLyogYWRkaXRpb25hbCBEQ1ggZmxhZ3MgCiAgKi8KQEAgLTQ0LDggKzQ1LDkgQEAKIH0gRENFOwogCiAKLWV4dGVybiB2b2lkIERDRV9Jbml0KHZvaWQpOwotZXh0ZXJuIERDRSAqRENFX0FsbG9jRENFKCBIV05EMzIgaFduZCwgRENFX1RZUEUgdHlwZSApOwotZXh0ZXJuIHZvaWQgRENFX0ZyZWVEQ0UoIERDRSAqZGNlICk7CitleHRlcm4gdm9pZCAgRENFX0luaXQodm9pZCk7CitleHRlcm4gRENFKiAgRENFX0FsbG9jRENFKCBIV05EMzIgaFduZCwgRENFX1RZUEUgdHlwZSApOworZXh0ZXJuIHZvaWQgIERDRV9GcmVlRENFKCBEQ0UgKmRjZSApOworZXh0ZXJuIElOVDE2IERDRV9FeGNsdWRlUmduKCBIREMzMiwgV05EKiwgSFJHTjMyICk7CiAKICNlbmRpZiAgLyogRENFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaG9vay5oIGIvaW5jbHVkZS9ob29rLmgKaW5kZXggNTM1YWZjMi4uMmE5ODU3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ob29rLmgKKysrIGIvaW5jbHVkZS9ob29rLmgKQEAgLTEzLDYgKzEzLDcgQEAKIGV4dGVybiBMUkVTVUxUIEhPT0tfQ2FsbEhvb2tzKCBJTlQxNiBpZCwgSU5UMTYgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKIGV4dGVybiBIT09LUFJPQzE2IEhPT0tfR2V0UHJvYzE2KCBISE9PSyBob29rICk7CitleHRlcm4gdm9pZCBIT09LX1Jlc2V0UXVldWVIb29rcyggSFFVRVVFMTYgaFF1ZXVlICk7CiBleHRlcm4gdm9pZCBIT09LX0ZyZWVNb2R1bGVIb29rcyggSE1PRFVMRTE2IGhNb2R1bGUgKTsKIGV4dGVybiB2b2lkIEhPT0tfRnJlZVF1ZXVlSG9va3MoIEhRVUVVRTE2IGhRdWV1ZSApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2tleWJvYXJkLmggYi9pbmNsdWRlL2tleWJvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVmNjgxYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva2V5Ym9hcmQuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogS2V5Ym9hcmQgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworI2lmbmRlZiBfX1dJTkVfS0VZQk9BUkRfSAorI2RlZmluZSBfX1dJTkVfS0VZQk9BUkRfSAorCisjZGVmaW5lIFdJTkVfVktFWV9NQVBQSU5HU1wKKwkJdmtjYXNlKCchJywgJzEnKVwKKwkJdmtjYXNlKCdAJywgJzInKVwKKwkJdmtjYXNlKCcjJywgJzMnKVwKKwkJdmtjYXNlKCckJywgJzQnKVwKKwkJdmtjYXNlKCclJywgJzUnKVwKKwkJdmtjYXNlKCdeJywgJzYnKVwKKwkJdmtjYXNlKCcmJywgJzcnKVwKKwkJdmtjYXNlKCcqJywgJzgnKVwKKwkJdmtjYXNlKCcoJywgJzknKVwKKwkJdmtjYXNlKCcpJywgJzAnKVwKKwkJdmtjYXNlMignYCcsICd+JywgMHhjMClcCisJCXZrY2FzZTIoJy0nLCAnXycsIDB4YmQpXAorCQl2a2Nhc2UyKCc9JywgJysnLCAweGJiKVwKKwkJdmtjYXNlMignWycsICd7JywgMHhkYilcCisJCXZrY2FzZTIoJ10nLCAnfScsIDB4ZGQpXAorCQl2a2Nhc2UyKCc7JywgJzonLCAweGJhKVwKKwkJdmtjYXNlMignXCcnLCAnIicsIDB4ZGUpXAorCQl2a2Nhc2UyKCcsJywgJzwnLCAweGJjKVwKKwkJdmtjYXNlMignLicsICc+JywgMHhiZSlcCisJCXZrY2FzZTIoJy8nLCAnPycsIDB4YmYpXAorCQl2a2Nhc2UyKCdcXCcsICd8JywgMHhkYykKKworI2VuZGlmICAvKiBfX1dJTkVfS0VZQk9BUkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saXN0Ym94LmggYi9pbmNsdWRlL2xpc3Rib3guaAppbmRleCAzY2ZlNDI2Li5lYmVlODEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpc3Rib3guaAorKysgYi9pbmNsdWRlL2xpc3Rib3guaApAQCAtNjksNSArNjksMyBAQAogCQkJICAgICBXT1JEIGl0ZW1TdGF0ZSk7CiBleHRlcm4gaW50IExpc3RCb3hGaW5kTW91c2UoTFBIRUFETElTVCBscGhsLCBpbnQgWCwgaW50IFkpOwogZXh0ZXJuIHZvaWQgTGlzdEJveEFza01lYXN1cmUoTFBIRUFETElTVCBscGhsLCBMUExJU1RTVFJVQ1QgbHBscyk7Ci0KLWV4dGVybiBMUkVTVUxUIExpc3RCb3hXbmRQcm9jKEhXTkQgaHduZCxVSU5UIG1lc3NhZ2UsV1BBUkFNMTYgd1BhcmFtLExQQVJBTSBsUGFyYW0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4uaCBiL2luY2x1ZGUvd2luLmgKaW5kZXggMThjMzMyMS4uNDQ1ZWUzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4uaAorKysgYi9pbmNsdWRlL3dpbi5oCkBAIC05Miw3ICs5Miw3IEBACiBleHRlcm4gSFdORDMyIFdJTl9GaW5kV2luVG9SZXBhaW50KCBIV05EMzIgaHduZCwgSFFVRVVFMTYgaFF1ZXVlICk7CiBleHRlcm4gdm9pZCBXSU5fU2VuZFBhcmVudE5vdGlmeSggSFdORDMyIGh3bmQsIFdPUkQgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBpZENoaWxkLCBMUEFSQU0gbFZhbHVlICk7Ci1leHRlcm4gdm9pZCBXSU5fRGVzdHJveVF1ZXVlV2luZG93cyggV05EKiB3bmQsIEhRVUVVRTE2IGhRdWV1ZSApOworZXh0ZXJuIHZvaWQgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBXTkQqIHduZCwgSFFVRVVFMTYgaFF1ZXVlLCBIUVVFVUUxNiBoTmV3ICk7CiBleHRlcm4gQk9PTDMyIFdJTl9DcmVhdGVEZXNrdG9wV2luZG93KHZvaWQpOwogZXh0ZXJuIEhXTkQzMiBXSU5fR2V0VG9wUGFyZW50KCBIV05EMzIgaHduZCApOwogZXh0ZXJuIEJPT0wzMiBXSU5fSXNXaW5kb3dEcmF3YWJsZShXTkQqLCBCT09MMzIgKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggOGUwM2Y0OS4uMmNmMzU5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTkyMCw4ICs5MjAsNDAgQEAKICAgV0NIQVIgICAgICBlbGZTdHlsZVtMRl9GQUNFU0laRV0gV0lORV9QQUNLRUQ7CiB9IEVOVU1MT0dGT05UMzJXLCAqTFBFTlVNTE9HRk9OVDMyVzsKIAordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTE9HRk9OVDE2ICBlbGZMb2dGb250OworICBCWVRFICAgICAgIGVsZkZ1bGxOYW1lW0xGX0ZVTExGQUNFU0laRV0gV0lORV9QQUNLRUQ7CisgIEJZVEUgICAgICAgZWxmU3R5bGVbTEZfRkFDRVNJWkVdIFdJTkVfUEFDS0VEOworICBCWVRFICAgICAgIGVsZlNjcmlwdFtMRl9GQUNFU0laRV0gV0lORV9QQUNLRUQ7Cit9IEVOVU1MT0dGT05URVgxNiwgKkxQRU5VTUxPR0ZPTlRFWDE2OworCit0eXBlZGVmIHN0cnVjdAoreworICBMT0dGT05UMzJBIGVsZkxvZ0ZvbnQ7CisgIEJZVEUgICAgICAgZWxmRnVsbE5hbWVbTEZfRlVMTEZBQ0VTSVpFXSBXSU5FX1BBQ0tFRDsKKyAgQllURSAgICAgICBlbGZTdHlsZVtMRl9GQUNFU0laRV0gV0lORV9QQUNLRUQ7CisgIEJZVEUgICAgICAgZWxmU2NyaXB0W0xGX0ZBQ0VTSVpFXSBXSU5FX1BBQ0tFRDsKK30gRU5VTUxPR0ZPTlRFWDMyQSwqTFBFTlVNTE9HRk9OVEVYMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICBMT0dGT05UMzJXIGVsZkxvZ0ZvbnQ7CisgIFdDSEFSICAgICAgZWxmRnVsbE5hbWVbTEZfRlVMTEZBQ0VTSVpFXSBXSU5FX1BBQ0tFRDsKKyAgV0NIQVIgICAgICBlbGZTdHlsZVtMRl9GQUNFU0laRV0gV0lORV9QQUNLRUQ7CisgIFdDSEFSICAgICAgZWxmU2NyaXB0W0xGX0ZBQ0VTSVpFXSBXSU5FX1BBQ0tFRDsKK30gRU5VTUxPR0ZPTlRFWDMyVywqTFBFTlVNTE9HRk9OVEVYMzJXOworCiBERUNMX1dJTkVMSUJfVFlQRV9BVyhFTlVNTE9HRk9OVCk7CiBERUNMX1dJTkVMSUJfVFlQRV9BVyhMUEVOVU1MT0dGT05UKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQRU5VTUxPR0ZPTlRFWCk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgIERXT1JEIGZzVXNiWzRdOworICBEV09SRCBmc0NzYlsyXTsKK30gRk9OVFNJR05BVFVSRSwqTFBGT05UU0lHTkFUVVJFOworCiAKICAgLyogbGZXZWlnaHQgdmFsdWVzICovCiAjZGVmaW5lIEZXX0RPTlRDQVJFCSAgICAwCkBAIC0xMDU3LDExICsxMDg5LDEzMCBAQAogREVDTF9XSU5FTElCX1RZUEVfQVcoVEVYVE1FVFJJQyk7CiBERUNMX1dJTkVMSUJfVFlQRV9BVyhMUFRFWFRNRVRSSUMpOwogCisvKiBudG1GbGFncyBmaWVsZCBmbGFncyAqLworI2RlZmluZSBOVE1fUkVHVUxBUiAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgTlRNX0JPTEQgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIE5UTV9JVEFMSUMgICAgICAweDAwMDAwMDAxTAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDE2ICAgICB0bUhlaWdodDsKKyAgICBJTlQxNiAgICAgdG1Bc2NlbnQ7CisgICAgSU5UMTYgICAgIHRtRGVzY2VudDsKKyAgICBJTlQxNiAgICAgdG1JbnRlcm5hbExlYWRpbmc7CisgICAgSU5UMTYgICAgIHRtRXh0ZXJuYWxMZWFkaW5nOworICAgIElOVDE2ICAgICB0bUF2ZUNoYXJXaWR0aDsKKyAgICBJTlQxNiAgICAgdG1NYXhDaGFyV2lkdGg7CisgICAgSU5UMTYgICAgIHRtV2VpZ2h0OworICAgIEJZVEUgICAgICB0bUl0YWxpYzsKKyAgICBCWVRFICAgICAgdG1VbmRlcmxpbmVkOworICAgIEJZVEUgICAgICB0bVN0cnVja091dDsKKyAgICBCWVRFICAgICAgdG1GaXJzdENoYXI7CisgICAgQllURSAgICAgIHRtTGFzdENoYXI7CisgICAgQllURSAgICAgIHRtRGVmYXVsdENoYXI7CisgICAgQllURSAgICAgIHRtQnJlYWtDaGFyOworICAgIEJZVEUgICAgICB0bVBpdGNoQW5kRmFtaWx5OworICAgIEJZVEUgICAgICB0bUNoYXJTZXQ7CisgICAgSU5UMTYgICAgIHRtT3ZlcmhhbmcgV0lORV9QQUNLRUQ7CisgICAgSU5UMTYgICAgIHRtRGlnaXRpemVkQXNwZWN0WCBXSU5FX1BBQ0tFRDsKKyAgICBJTlQxNiAgICAgdG1EaWdpdGl6ZWRBc3BlY3RZIFdJTkVfUEFDS0VEOworICAgIERXT1JEICAgICBudG1GbGFnczsKKyAgICBVSU5UMTYgICAgbnRtU2l6ZUVNOworICAgIFVJTlQxNiAgICBudG1DZWxsSGVpZ2h0OworICAgIFVJTlQxNiAgICBudG1BdmdXaWR0aDsKK30gTkVXVEVYVE1FVFJJQzE2LCpMUE5FV1RFWFRNRVRSSUMxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBJTlQzMiAgICAgdG1IZWlnaHQ7CisgICAgSU5UMzIgICAgIHRtQXNjZW50OworICAgIElOVDMyICAgICB0bURlc2NlbnQ7CisgICAgSU5UMzIgICAgIHRtSW50ZXJuYWxMZWFkaW5nOworICAgIElOVDMyICAgICB0bUV4dGVybmFsTGVhZGluZzsKKyAgICBJTlQzMiAgICAgdG1BdmVDaGFyV2lkdGg7CisgICAgSU5UMzIgICAgIHRtTWF4Q2hhcldpZHRoOworICAgIElOVDMyICAgICB0bVdlaWdodDsKKyAgICBJTlQzMiAgICAgdG1PdmVyaGFuZzsKKyAgICBJTlQzMiAgICAgdG1EaWdpdGl6ZWRBc3BlY3RYOworICAgIElOVDMyICAgICB0bURpZ2l0aXplZEFzcGVjdFk7CisgICAgQllURSAgICAgIHRtRmlyc3RDaGFyOworICAgIEJZVEUgICAgICB0bUxhc3RDaGFyOworICAgIEJZVEUgICAgICB0bURlZmF1bHRDaGFyOworICAgIEJZVEUgICAgICB0bUJyZWFrQ2hhcjsKKyAgICBCWVRFICAgICAgdG1JdGFsaWM7CisgICAgQllURSAgICAgIHRtVW5kZXJsaW5lZDsKKyAgICBCWVRFICAgICAgdG1TdHJ1Y2tPdXQ7CisgICAgQllURSAgICAgIHRtUGl0Y2hBbmRGYW1pbHk7CisgICAgQllURSAgICAgIHRtQ2hhclNldDsKKyAgICBEV09SRCAgICAgbnRtRmxhZ3M7CisgICAgVUlOVDMyICAgIG50bVNpemVFTTsKKyAgICBVSU5UMzIgICAgbnRtQ2VsbEhlaWdodDsKKyAgICBVSU5UMzIgICAgbnRtQXZnV2lkdGg7Cit9IE5FV1RFWFRNRVRSSUMzMkEsICpMUE5FV1RFWFRNRVRSSUMzMkE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgICAgIHRtSGVpZ2h0OworICAgIElOVDMyICAgICB0bUFzY2VudDsKKyAgICBJTlQzMiAgICAgdG1EZXNjZW50OworICAgIElOVDMyICAgICB0bUludGVybmFsTGVhZGluZzsKKyAgICBJTlQzMiAgICAgdG1FeHRlcm5hbExlYWRpbmc7CisgICAgSU5UMzIgICAgIHRtQXZlQ2hhcldpZHRoOworICAgIElOVDMyICAgICB0bU1heENoYXJXaWR0aDsKKyAgICBJTlQzMiAgICAgdG1XZWlnaHQ7CisgICAgSU5UMzIgICAgIHRtT3Zlcmhhbmc7CisgICAgSU5UMzIgICAgIHRtRGlnaXRpemVkQXNwZWN0WDsKKyAgICBJTlQzMiAgICAgdG1EaWdpdGl6ZWRBc3BlY3RZOworICAgIFdDSEFSICAgICB0bUZpcnN0Q2hhcjsKKyAgICBXQ0hBUiAgICAgdG1MYXN0Q2hhcjsKKyAgICBXQ0hBUiAgICAgdG1EZWZhdWx0Q2hhcjsKKyAgICBXQ0hBUiAgICAgdG1CcmVha0NoYXI7CisgICAgQllURSAgICAgIHRtSXRhbGljOworICAgIEJZVEUgICAgICB0bVVuZGVybGluZWQ7CisgICAgQllURSAgICAgIHRtU3RydWNrT3V0OworICAgIEJZVEUgICAgICB0bVBpdGNoQW5kRmFtaWx5OworICAgIEJZVEUgICAgICB0bUNoYXJTZXQ7CisgICAgRFdPUkQgICAgIG50bUZsYWdzOworICAgIFVJTlQzMiAgICBudG1TaXplRU07CisgICAgVUlOVDMyICAgIG50bUNlbGxIZWlnaHQ7CisgICAgVUlOVDMyICAgIG50bUF2Z1dpZHRoOworfSBORVdURVhUTUVUUklDMzJXLCAqTFBORVdURVhUTUVUUklDMzJXOworCitERUNMX1dJTkVMSUJfVFlQRV9BVyhORVdURVhUTUVUUklDKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQTkVXVEVYVE1FVFJJQyk7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTkVXVEVYVE1FVFJJQzE2CW50bWV0bTsKKyAgICBGT05UU0lHTkFUVVJFICAgICAgIG50bWVGb250U2lnbmF0dXJlOworfSBORVdURVhUTUVUUklDRVgxNiwqTFBORVdURVhUTUVUUklDRVgxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBORVdURVhUTUVUUklDMzJBCW50bWV0bTsKKyAgICBGT05UU0lHTkFUVVJFICAgICAgIG50bWVGb250U2lnbmF0dXJlOworfSBORVdURVhUTUVUUklDRVgzMkEsKkxQTkVXVEVYVE1FVFJJQ0VYMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIE5FV1RFWFRNRVRSSUMzMlcJbnRtZXRtOworICAgIEZPTlRTSUdOQVRVUkUgICAgICAgbnRtZUZvbnRTaWduYXR1cmU7Cit9IE5FV1RFWFRNRVRSSUNFWDMyVywqTFBORVdURVhUTUVUUklDRVgzMlc7CisKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKE5FV1RFWFRNRVRSSUNFWCk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhMUE5FV1RFWFRNRVRSSUNFWCk7CisKKwogdHlwZWRlZiBJTlQxNiAoKkZPTlRFTlVNUFJPQzE2KShTRUdQVFIsU0VHUFRSLFVJTlQxNixMUEFSQU0pOwotdHlwZWRlZiBJTlQzMiAoKkZPTlRFTlVNUFJPQzMyQSkoY29uc3QgTE9HRk9OVDMyQSosY29uc3QgVEVYVE1FVFJJQzMyQSosVUlOVDMyLExQQVJBTSk7Ci10eXBlZGVmIElOVDMyICgqRk9OVEVOVU1QUk9DMzJXKShjb25zdCBMT0dGT05UMzJXKixjb25zdCBURVhUTUVUUklDMzJXKixVSU5UMzIsTFBBUkFNKTsKK3R5cGVkZWYgSU5UMzIgKCpGT05URU5VTVBST0MzMkEpKExQRU5VTUxPR0ZPTlQzMkEsTFBORVdURVhUTUVUUklDMzJBLFVJTlQzMixMUEFSQU0pOwordHlwZWRlZiBJTlQzMiAoKkZPTlRFTlVNUFJPQzMyVykoTFBFTlVNTE9HRk9OVDMyVyxMUE5FV1RFWFRNRVRSSUMzMlcsVUlOVDMyLExQQVJBTSk7CiBERUNMX1dJTkVMSUJfVFlQRV9BVyhGT05URU5VTVBST0MpOwogCit0eXBlZGVmIElOVDE2ICgqRk9OVEVOVU1QUk9DRVgxNikoU0VHUFRSLFNFR1BUUixVSU5UMTYsTFBBUkFNKTsKK3R5cGVkZWYgSU5UMzIgKCpGT05URU5VTVBST0NFWDMyQSkoTFBFTlVNTE9HRk9OVEVYMzJBLExQTkVXVEVYVE1FVFJJQ0VYMzJBLFVJTlQzMixMUEFSQU0pOwordHlwZWRlZiBJTlQzMiAoKkZPTlRFTlVNUFJPQ0VYMzJXKShMUEVOVU1MT0dGT05URVgzMlcsTFBORVdURVhUTUVUUklDRVgzMlcsVUlOVDMyLExQQVJBTSk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhGT05URU5VTVBST0NFWCk7CisKICAgLyogdG1QaXRjaEFuZEZhbWlseSB2YWx1ZXMgKi8KICNkZWZpbmUgVE1QRl9GSVhFRF9QSVRDSCAgICAxCiAjZGVmaW5lIFRNUEZfVkVDVE9SCSAgICAyCkBAIC0yNzI0LDcgKzI4NzUsMTIgQEAKICNkZWZpbmUgTEJfRklORFNUUklOR0VYQUNUMTYgICAgIChXTV9VU0VSKzM1KQogI2RlZmluZSBMQl9GSU5EU1RSSU5HRVhBQ1QzMiAgICAgMHgwMWEyCiAjZGVmaW5lIExCX0ZJTkRTVFJJTkdFWEFDVCAgICAgICBXSU5FTElCX05BTUUoTEJfRklORFNUUklOR0VYQUNUKQotLyogSGVyZSBhcmUgMiB1bmRvY3VtZW50ZWQgbWVzc2FnZXMgdXNlZCBieSBDb21ib0xCb3hlcyAqLworI2RlZmluZSBMQl9DQVJFVE9OMTYgICAgICAgICAgICAgKFdNX1VTRVIrMzYpCisjZGVmaW5lIExCX0NBUkVUT04zMiAgICAgICAgICAgICAweDAxYTMKKyNkZWZpbmUgTEJfQ0FSRVRPTiAgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShMQl9DQVJFVE9OKQorI2RlZmluZSBMQl9DQVJFVE9GRjE2ICAgICAgICAgICAgKFdNX1VTRVIrMzcpCisjZGVmaW5lIExCX0NBUkVUT0ZGMzIgICAgICAgICAgICAweDAxYTQKKyNkZWZpbmUgTEJfQ0FSRVRPRkYgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShMQl9DQVJFVE9GRikKICNkZWZpbmUgTEJfU0VUTE9DQUxFMTYgICAgICAgICAgIFdNX05VTEwgIC8qIE5vdCBpbiBXaW4xNiAqLwogI2RlZmluZSBMQl9TRVRMT0NBTEUzMiAgICAgICAgICAgMHgwMWE1CiAjZGVmaW5lIExCX1NFVExPQ0FMRSAgICAgICAgICAgICBXSU5FTElCX05BTUUoTEJfU0VUTE9DQUxFKQpAQCAtMzA4OCwxNiArMzI0NCwyMiBAQAogI2RlZmluZSBWS19SQlVUVE9OICAgICAgICAgIDB4MDIKICNkZWZpbmUgVktfQ0FOQ0VMICAgICAgICAgICAweDAzCiAjZGVmaW5lIFZLX01CVVRUT04gICAgICAgICAgMHgwNAorLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDUtMHgwNyAgVW5kZWZpbmVkICovCiAjZGVmaW5lIFZLX0JBQ0sgICAgICAgICAgICAgMHgwOAogI2RlZmluZSBWS19UQUIgICAgICAgICAgICAgIDB4MDkKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDBBLTB4MEIgIFVuZGVmaW5lZCAqLwogI2RlZmluZSBWS19DTEVBUiAgICAgICAgICAgIDB4MEMKICNkZWZpbmUgVktfUkVUVVJOICAgICAgICAgICAweDBECisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRS0weDBGICBVbmRlZmluZWQgKi8KICNkZWZpbmUgVktfU0hJRlQgICAgICAgICAgICAweDEwCiAjZGVmaW5lIFZLX0NPTlRST0wgICAgICAgICAgMHgxMQogI2RlZmluZSBWS19NRU5VICAgICAgICAgICAgIDB4MTIKICNkZWZpbmUgVktfUEFVU0UgICAgICAgICAgICAweDEzCiAjZGVmaW5lIFZLX0NBUElUQUwgICAgICAgICAgMHgxNAorLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUtMHgxOSAgUmVzZXJ2ZWQgZm9yIEthbmppIHN5c3RlbXMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDFBICAgICAgIFVuZGVmaW5lZCAqLwogI2RlZmluZSBWS19FU0NBUEUgICAgICAgICAgIDB4MUIKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDLTB4MUYgIFJlc2VydmVkIGZvciBLYW5qaSBzeXN0ZW1zICovCiAjZGVmaW5lIFZLX1NQQUNFICAgICAgICAgICAgMHgyMAogI2RlZmluZSBWS19QUklPUiAgICAgICAgICAgIDB4MjEKICNkZWZpbmUgVktfTkVYVCAgICAgICAgICAgICAweDIyCkBAIC0zMTA4LDEyICszMjcwLDUwIEBACiAjZGVmaW5lIFZLX1JJR0hUICAgICAgICAgICAgMHgyNwogI2RlZmluZSBWS19ET1dOICAgICAgICAgICAgIDB4MjgKICNkZWZpbmUgVktfU0VMRUNUICAgICAgICAgICAweDI5Ci0jZGVmaW5lIFZLX1BSSU5UICAgICAgICAgICAgMHgyQQorI2RlZmluZSBWS19QUklOVCAgICAgICAgICAgIDB4MkEgLyogT0VNIHNwZWNpZmljIGluIFdpbmRvd3MgMy4xIFNESyAqLwogI2RlZmluZSBWS19FWEVDVVRFICAgICAgICAgIDB4MkIKICNkZWZpbmUgVktfU05BUFNIT1QgICAgICAgICAweDJDCiAjZGVmaW5lIFZLX0lOU0VSVCAgICAgICAgICAgMHgyRAogI2RlZmluZSBWS19ERUxFVEUgICAgICAgICAgIDB4MkUKICNkZWZpbmUgVktfSEVMUCAgICAgICAgICAgICAweDJGCisjZGVmaW5lIFZLXzAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBWS18xICAgICAgICAgICAgICAgIDB4MzEKKyNkZWZpbmUgVktfMiAgICAgICAgICAgICAgICAweDMyCisjZGVmaW5lIFZLXzMgICAgICAgICAgICAgICAgMHgzMworI2RlZmluZSBWS180ICAgICAgICAgICAgICAgIDB4MzQKKyNkZWZpbmUgVktfNSAgICAgICAgICAgICAgICAweDM1CisjZGVmaW5lIFZLXzYgICAgICAgICAgICAgICAgMHgzNgorI2RlZmluZSBWS183ICAgICAgICAgICAgICAgIDB4MzcKKyNkZWZpbmUgVktfOCAgICAgICAgICAgICAgICAweDM4CisjZGVmaW5lIFZLXzkgICAgICAgICAgICAgICAgMHgzOQorLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0EtMHg0MCAgVW5kZWZpbmVkICovCisjZGVmaW5lIFZLX0EgICAgICAgICAgICAgICAgMHg0MQorI2RlZmluZSBWS19CICAgICAgICAgICAgICAgIDB4NDIKKyNkZWZpbmUgVktfQyAgICAgICAgICAgICAgICAweDQzCisjZGVmaW5lIFZLX0QgICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBWS19FICAgICAgICAgICAgICAgIDB4NDUKKyNkZWZpbmUgVktfRiAgICAgICAgICAgICAgICAweDQ2CisjZGVmaW5lIFZLX0cgICAgICAgICAgICAgICAgMHg0NworI2RlZmluZSBWS19IICAgICAgICAgICAgICAgIDB4NDgKKyNkZWZpbmUgVktfSSAgICAgICAgICAgICAgICAweDQ5CisjZGVmaW5lIFZLX0ogICAgICAgICAgICAgICAgMHg0QQorI2RlZmluZSBWS19LICAgICAgICAgICAgICAgIDB4NEIKKyNkZWZpbmUgVktfTCAgICAgICAgICAgICAgICAweDRDCisjZGVmaW5lIFZLX00gICAgICAgICAgICAgICAgMHg0RAorI2RlZmluZSBWS19OICAgICAgICAgICAgICAgIDB4NEUKKyNkZWZpbmUgVktfTyAgICAgICAgICAgICAgICAweDRGCisjZGVmaW5lIFZLX1AgICAgICAgICAgICAgICAgMHg1MAorI2RlZmluZSBWS19RICAgICAgICAgICAgICAgIDB4NTEKKyNkZWZpbmUgVktfUiAgICAgICAgICAgICAgICAweDUyCisjZGVmaW5lIFZLX1MgICAgICAgICAgICAgICAgMHg1MworI2RlZmluZSBWS19UICAgICAgICAgICAgICAgIDB4NTQKKyNkZWZpbmUgVktfVSAgICAgICAgICAgICAgICAweDU1CisjZGVmaW5lIFZLX1YgICAgICAgICAgICAgICAgMHg1NgorI2RlZmluZSBWS19XICAgICAgICAgICAgICAgIDB4NTcKKyNkZWZpbmUgVktfWCAgICAgICAgICAgICAgICAweDU4CisjZGVmaW5lIFZLX1kgICAgICAgICAgICAgICAgMHg1OQorI2RlZmluZSBWS19aICAgICAgICAgICAgICAgIDB4NUEKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDVCLTB4NUYgIFVuZGVmaW5lZCAqLwogI2RlZmluZSBWS19OVU1QQUQwICAgICAgICAgIDB4NjAKICNkZWZpbmUgVktfTlVNUEFEMSAgICAgICAgICAweDYxCiAjZGVmaW5lIFZLX05VTVBBRDIgICAgICAgICAgMHg2MgpAQCAtMzE1NCw4ICszMzU0LDE4IEBACiAjZGVmaW5lIFZLX0YyMiAgICAgICAgICAgICAgMHg4NQogI2RlZmluZSBWS19GMjMgICAgICAgICAgICAgIDB4ODYKICNkZWZpbmUgVktfRjI0ICAgICAgICAgICAgICAweDg3CisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OC0weDhGICBVbmFzc2lnbmVkICovCiAjZGVmaW5lIFZLX05VTUxPQ0sgICAgICAgICAgMHg5MAogI2RlZmluZSBWS19TQ1JPTEwgICAgICAgICAgIDB4OTEKKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyLTB4QjkgIFVuYXNzaWduZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweEJBLTB4QzAgIE9FTSBzcGVjaWZpYyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzEtMHhEQSAgVW5hc3NpZ25lZCAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4REItMHhFNCAgT0VNIHNwZWNpZmljICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNSAgICAgICBVbmFzc2lnbmVkICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhFNiAgICAgICBPRU0gc3BlY2lmaWMgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweEU3LTB4RTggIFVuYXNzaWduZWQgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAweEU5LTB4RjUgIE9FTSBzcGVjaWZpYyAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjYtMHhGRSAgVW5hc3NpZ25lZCAqLwogCiAgIAogI2RlZmluZSBMTUVNX0ZJWEVEICAgICAgICAgIDAgICAKQEAgLTM3MDUsNiArMzkxNSwxMCBAQAogdHlwZWRlZiBCT09MMzIgKCpDT0RFUEFHRV9FTlVNUFJPQzMyVykoTFBXU1RSKTsKIERFQ0xfV0lORUxJQl9UWVBFX0FXKENPREVQQUdFX0VOVU1QUk9DKTsKIAordHlwZWRlZiBCT09MMzIgKCpMT0NBTEVfRU5VTVBST0MzMkEpKExQU1RSKTsKK3R5cGVkZWYgQk9PTDMyICgqTE9DQUxFX0VOVU1QUk9DMzJXKShMUFdTVFIpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTE9DQUxFX0VOVU1QUk9DKTsKKwogdHlwZWRlZiBzdHJ1Y3QgdGFnU1lTVEVNX0lORk8KIHsKICAgICBEV09SRCAgIGR3T2VtSWQ7CkBAIC0zNzQyLDEwICszOTU2LDYgQEAKIFZPSUQgICAgICAgRmlsbFdpbmRvdyhIV05EMTYsSFdORDE2LEhEQzE2LEhCUlVTSDE2KTsKIElOVDE2ICAgICAgRmx1c2hDb21tKElOVDE2LElOVDE2KTsKIFdPUkQgICAgICAgRnJlZVNlbGVjdG9yKFdPUkQpOwotdm9pZCAgICAgICBHbG9iYWxGcmVlQWxsKEhHTE9CQUwxNik7Ci1IR0xPQkFMMTYgIEdsb2JhbExSVU5ld2VzdChIR0xPQkFMMTYpOwotSEdMT0JBTDE2ICBHbG9iYWxMUlVPbGRlc3QoSEdMT0JBTDE2KTsKLVZPSUQgICAgICAgR2xvYmFsTm90aWZ5KEZBUlBST0MxNik7CiBIQU5ETEUxNiAgIEdldEF0b21IYW5kbGUoQVRPTSk7CiBEV09SRCAgICAgIEdldEJpdG1hcERpbWVuc2lvbihIQklUTUFQMTYpOwogSEFORExFMTYgICBHZXRDb2RlSGFuZGxlKEZBUlBST0MxNik7CkBAIC0zNzU1LDYgKzM5NjUsNyBAQAogSEFORExFMTYgICBHZXRDdXJyZW50UERCKHZvaWQpOwogSFRBU0sxNiAgICBHZXRDdXJyZW50VGFzayh2b2lkKTsKIERXT1JEICAgICAgR2V0RENIb29rKEhEQzE2LEZBUlBST0MxNiopOworRFdPUkQgICAgICBHZXREQ09yZyhIREMxNik7CiBIV05EMTYgICAgIEdldERlc2t0b3BId25kKHZvaWQpOwogSE1PRFVMRTE2ICBHZXRFeGVQdHIoSEFORExFMTYpOwogV09SRCAgICAgICBHZXRFeGVWZXJzaW9uKHZvaWQpOwpAQCAtMzc2OCw2ICszOTc5LDEwIEBACiBIUVVFVUUxNiAgIEdldFRhc2tRdWV1ZShIVEFTSzE2KTsKIERXT1JEICAgICAgR2xvYmFsRE9TQWxsb2MoRFdPUkQpOwogV09SRCAgICAgICBHbG9iYWxET1NGcmVlKFdPUkQpOwordm9pZCAgICAgICBHbG9iYWxGcmVlQWxsKEhHTE9CQUwxNik7CitIR0xPQkFMMTYgIEdsb2JhbExSVU5ld2VzdChIR0xPQkFMMTYpOworSEdMT0JBTDE2ICBHbG9iYWxMUlVPbGRlc3QoSEdMT0JBTDE2KTsKK1ZPSUQgICAgICAgR2xvYmFsTm90aWZ5KEZBUlBST0MxNik7CiBXT1JEICAgICAgIEdsb2JhbFBhZ2VMb2NrKEhHTE9CQUwxNik7CiBXT1JEICAgICAgIEdsb2JhbFBhZ2VVbmxvY2soSEdMT0JBTDE2KTsKIElOVDE2ICAgICAgSW5pdEFwcChISU5TVEFOQ0UxNik7CkBAIC0zODE1LDYgKzQwMzAsNyBAQAogVk9JRCAgICAgICBVc2VyWWllbGQodm9pZCk7CiBCT09MMTYgICAgIFdhaXRFdmVudChIVEFTSzE2KTsKIElOVDE2ICAgICAgV3JpdGVDb21tKElOVDE2LExQU1RSLElOVDE2KTsKK1ZPSUQgICAgICAgV3JpdGVPdXRQcm9maWxlcyhWT0lEKTsKIFZPSUQgICAgICAgaG1lbWNweShMUFZPSUQsTFBDVk9JRCxMT05HKTsKIFZPSUQgICAgICAgWWllbGQodm9pZCk7CiAKQEAgLTM4MzUsNiArNDA1MSw5IEBACiBCT09MMzIgICAgIEVudW1TeXN0ZW1Db2RlUGFnZXMzMkEoQ09ERVBBR0VfRU5VTVBST0MzMkEsRFdPUkQpOwogQk9PTDMyICAgICBFbnVtU3lzdGVtQ29kZVBhZ2VzMzJXKENPREVQQUdFX0VOVU1QUk9DMzJXLERXT1JEKTsKICNkZWZpbmUgICAgRW51bVN5c3RlbUNvZGVQYWdlcyBXSU5FTElCX05BTUVfQVcoRW51bVN5c3RlbUNvZGVQYWdlcykKK0JPT0wzMiAgICAgRW51bVN5c3RlbUxvY2FsZXMzMkEoTE9DQUxFX0VOVU1QUk9DMzJBLERXT1JEKTsKK0JPT0wzMiAgICAgRW51bVN5c3RlbUxvY2FsZXMzMlcoTE9DQUxFX0VOVU1QUk9DMzJXLERXT1JEKTsKKyNkZWZpbmUgICAgRW51bVN5c3RlbUxvY2FsZXMgV0lORUxJQl9OQU1FX0FXKEVudW1TeXN0ZW1Mb2NhbGVzKQogQk9PTDMyICAgICBFbnVtVGhyZWFkV2luZG93cyhEV09SRCxXTkRFTlVNUFJPQzMyLExQQVJBTSk7CiB2b2lkICAgICAgIEV4aXRQcm9jZXNzKERXT1JEKTsKIEJPT0wzMiAgICAgRmlsZVRpbWVUb0Rvc0RhdGVUaW1lKExQRklMRVRJTUUsTFBXT1JELExQV09SRCk7CkBAIC0zODQ4LDYgKzQwNjcsNyBAQAogTFBDV1NUUiAgICBHZXRDb21tYW5kTGluZTMyVygpOwogI2RlZmluZSAgICBHZXRDb21tYW5kTGluZSBXSU5FTElCX05BTUVfQVcoR2V0Q29tbWFuZExpbmUpCiBCT09MMzIgICAgIEdldENvbW1UaW1lb3V0cyhJTlQzMixMUENPTU1USU1FT1VUUyk7CitCT09MMzIgICAgIEdldERDT3JnRXgoSERDMzIsTFBQT0lOVDMyKTsKIERXT1JEICAgICAgR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoSEZJTEUsQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04qKTsKIERXT1JEICAgICAgR2V0RmlsZVNpemUoSEZJTEUsTFBEV09SRCk7CiBEV09SRCAgICAgIEdldEZpbGVUeXBlKEhGSUxFKTsKQEAgLTM4NzMsNiArNDA5Myw3IEBACiBCT09MMzIgICAgIEhlYXBVbmxvY2soSEFORExFMzIpOwogQk9PTDMyICAgICBIZWFwVmFsaWRhdGUoSEFORExFMzIsRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgSXNXaW5kb3dVbmljb2RlKEhXTkQzMik7CitCT09MMzIgICAgIElzVmFsaWRMb2NhbGUoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShMUEZJTEVUSU1FLExQRklMRVRJTUUpOwogTFBWT0lEICAgICBNYXBWaWV3T2ZGaWxlRXgoSEFORExFMzIsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBNb3ZlRmlsZTMyQShMUENTVFIsTFBDU1RSKTsKQEAgLTQyMjAsNyArNDQ0MSwxMSBAQAogSU5UMzIgICAgICBEaWFsb2dCb3hQYXJhbTMyQShISU5TVEFOQ0UzMixMUENTVFIsSFdORDMyLERMR1BST0MzMixMUEFSQU0pOwogSU5UMzIgICAgICBEaWFsb2dCb3hQYXJhbTMyVyhISU5TVEFOQ0UzMixMUENXU1RSLEhXTkQzMixETEdQUk9DMzIsTFBBUkFNKTsKICNkZWZpbmUgICAgRGlhbG9nQm94UGFyYW0gV0lORUxJQl9OQU1FX0FXKERpYWxvZ0JveFBhcmFtKQotSU5UMTYgICAgICBEbGdEaXJMaXN0Q29tYm9Cb3gxNihIV05EMTYsU0VHUFRSLElOVDE2LElOVDE2LFVJTlQxNik7CitJTlQxNiAgICAgIERsZ0Rpckxpc3QxNihIV05EMTYsTFBDU1RSLElOVDE2LElOVDE2LFVJTlQxNik7CitJTlQzMiAgICAgIERsZ0Rpckxpc3QzMkEoSFdORDMyLExQQ1NUUixJTlQzMixJTlQzMixVSU5UMzIpOworSU5UMzIgICAgICBEbGdEaXJMaXN0MzJXKEhXTkQzMixMUENXU1RSLElOVDMyLElOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIERsZ0Rpckxpc3QgV0lORUxJQl9OQU1FX0FXKERsZ0Rpckxpc3QpCitJTlQxNiAgICAgIERsZ0Rpckxpc3RDb21ib0JveDE2KEhXTkQxNixMUENTVFIsSU5UMTYsSU5UMTYsVUlOVDE2KTsKIElOVDMyICAgICAgRGxnRGlyTGlzdENvbWJvQm94MzJBKEhXTkQzMixMUENTVFIsSU5UMzIsSU5UMzIsVUlOVDMyKTsKIElOVDMyICAgICAgRGxnRGlyTGlzdENvbWJvQm94MzJXKEhXTkQzMixMUENXU1RSLElOVDMyLElOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIERsZ0Rpckxpc3RDb21ib0JveCBXSU5FTElCX05BTUVfQVcoRGxnRGlyTGlzdENvbWJvQm94KQpAQCAtNDI2NCw2ICs0NDg5LDE0IEBACiBJTlQzMiAgICAgIEVudW1Gb250RmFtaWxpZXMzMkEoSERDMzIsTFBDU1RSLEZPTlRFTlVNUFJPQzMyQSxMUEFSQU0pOwogSU5UMzIgICAgICBFbnVtRm9udEZhbWlsaWVzMzJXKEhEQzMyLExQQ1dTVFIsRk9OVEVOVU1QUk9DMzJXLExQQVJBTSk7CiAjZGVmaW5lICAgIEVudW1Gb250RmFtaWxpZXMgV0lORUxJQl9OQU1FX0FXKEVudW1Gb250RmFtaWxpZXMpCitJTlQxNiAgICAgIEVudW1Gb250RmFtaWxpZXNFeDE2KEhEQzE2LExQTE9HRk9OVDE2LEZPTlRFTlVNUFJPQ0VYMTYsTFBBUkFNLERXT1JEKTsKK0lOVDMyICAgICAgRW51bUZvbnRGYW1pbGllc0V4MzJBKEhEQzMyLExQTE9HRk9OVDMyQSxGT05URU5VTVBST0NFWDMyQSxMUEFSQU0sRFdPUkQpOworSU5UMzIgICAgICBFbnVtRm9udEZhbWlsaWVzRXgzMlcoSERDMzIsTFBMT0dGT05UMzJXLEZPTlRFTlVNUFJPQ0VYMzJXLExQQVJBTSxEV09SRCk7CisjZGVmaW5lICAgIEVudW1Gb250RmFtaWxpZXNFeCBXSU5FTElCX05BTUVfQVcoRW51bUZvbnRGYW1pbGllc0V4KQorSU5UMTYgICAgICBFbnVtRm9udHMxNihIREMxNixMUENTVFIsRk9OVEVOVU1QUk9DMTYsTFBBUkFNKTsKK0lOVDMyICAgICAgRW51bUZvbnRzMzJBKEhEQzMyLExQQ1NUUixGT05URU5VTVBST0MzMkEsTFBBUkFNKTsKK0lOVDMyICAgICAgRW51bUZvbnRzMzJXKEhEQzMyLExQQ1dTVFIsRk9OVEVOVU1QUk9DMzJXLExQQVJBTSk7CisjZGVmaW5lICAgIEVudW1Gb250cyBXSU5FTElCX05BTUVfQVcoRW51bUZvbnRzKQogSU5UMTYgICAgICBFbnVtT2JqZWN0czE2KEhEQzE2LElOVDE2LEdPQkpFTlVNUFJPQzE2LExQQVJBTSk7CiBJTlQzMiAgICAgIEVudW1PYmplY3RzMzIoSERDMzIsSU5UMzIsR09CSkVOVU1QUk9DMzIsTFBBUkFNKTsKICNkZWZpbmUgICAgRW51bU9iamVjdHMgV0lORUxJQl9OQU1FKEVudW1PYmplY3RzKQpAQCAtNDM4NCw2ICs0NjE3LDkgQEAKIHZvaWQgICAgICAgR2V0Q2xpcEN1cnNvcjE2KExQUkVDVDE2KTsKIHZvaWQgICAgICAgR2V0Q2xpcEN1cnNvcjMyKExQUkVDVDMyKTsKICNkZWZpbmUgICAgR2V0Q2xpcEN1cnNvciBXSU5FTElCX05BTUUoR2V0Q2xpcEN1cnNvcikKK0hSR04xNiAgICAgR2V0Q2xpcFJnbjE2KEhEQzE2KTsKK0lOVDMyICAgICAgR2V0Q2xpcFJnbjMyKEhEQzMyLEhSR04zMik7CisjZGVmaW5lICAgIEdldENsaXBSZ24gV0lORUxJQl9OQU1FKEdldENsaXBSZ24pCiBJTlQxNiAgICAgIEdldENvbW1TdGF0ZTE2KElOVDE2LExQRENCMTYpOwogQk9PTDMyICAgICBHZXRDb21tU3RhdGUzMihJTlQzMixMUERDQjMyKTsKICNkZWZpbmUgICAgR2V0Q29tbVN0YXRlIFdJTkVMSUJfTkFNRShHZXRDb21tU3RhdGUpCkBAIC00NDU5LDkgKzQ2OTUsMjUgQEAKIENPTE9SUkVGICAgR2V0UGl4ZWwxNihIREMxNixJTlQxNixJTlQxNik7CiBDT0xPUlJFRiAgIEdldFBpeGVsMzIoSERDMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBHZXRQaXhlbCBXSU5FTElCX05BTUUoR2V0UGl4ZWwpCitVSU5UMTYgICAgIEdldFByaXZhdGVQcm9maWxlSW50MTYoTFBDU1RSLExQQ1NUUixJTlQxNixMUENTVFIpOworVUlOVDMyICAgICBHZXRQcml2YXRlUHJvZmlsZUludDMyQShMUENTVFIsTFBDU1RSLElOVDMyLExQQ1NUUik7CitVSU5UMzIgICAgIEdldFByaXZhdGVQcm9maWxlSW50MzJXKExQQ1dTVFIsTFBDV1NUUixJTlQzMixMUENXU1RSKTsKKyNkZWZpbmUgICAgR2V0UHJpdmF0ZVByb2ZpbGVJbnQgV0lORUxJQl9OQU1FX0FXKEdldFByaXZhdGVQcm9maWxlSW50KQorSU5UMTYgICAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzE2KExQQ1NUUixMUENTVFIsTFBDU1RSLExQU1RSLElOVDE2LExQQ1NUUik7CitJTlQzMiAgICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSLExQU1RSLElOVDMyLExQQ1NUUik7CitJTlQzMiAgICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLExQV1NUUixJTlQzMixMUENXU1RSKTsKKyNkZWZpbmUgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcgV0lORUxJQl9OQU1FX0FXKEdldFByaXZhdGVQcm9maWxlU3RyaW5nKQogRkFSUFJPQzE2ICBHZXRQcm9jQWRkcmVzczE2KEhNT0RVTEUxNixTRUdQVFIpOwogRkFSUFJPQzMyICBHZXRQcm9jQWRkcmVzczMyKEhNT0RVTEUzMixMUENTVFIpOwogI2RlZmluZSAgICBHZXRQcm9jQWRkcmVzcyBXSU5FTElCX05BTUUoR2V0UHJvY0FkZHJlc3MpCitVSU5UMTYgICAgIEdldFByb2ZpbGVJbnQxNihMUENTVFIsTFBDU1RSLElOVDE2KTsKK1VJTlQzMiAgICAgR2V0UHJvZmlsZUludDMyQShMUENTVFIsTFBDU1RSLElOVDMyKTsKK1VJTlQzMiAgICAgR2V0UHJvZmlsZUludDMyVyhMUENXU1RSLExQQ1dTVFIsSU5UMzIpOworI2RlZmluZSAgICBHZXRQcm9maWxlSW50IFdJTkVMSUJfTkFNRV9BVyhHZXRQcm9maWxlSW50KQorSU5UMTYgICAgICBHZXRQcm9maWxlU3RyaW5nMTYoTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsSU5UMTYpOworSU5UMzIgICAgICBHZXRQcm9maWxlU3RyaW5nMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSLExQU1RSLElOVDMyKTsKK0lOVDMyICAgICAgR2V0UHJvZmlsZVN0cmluZzMyVyhMUENXU1RSLExQQ1dTVFIsTFBDV1NUUixMUFdTVFIsSU5UMzIpOworI2RlZmluZSAgICBHZXRQcm9maWxlU3RyaW5nIFdJTkVMSUJfTkFNRV9BVyhHZXRQcm9maWxlU3RyaW5nKQogSEFORExFMTYgICBHZXRQcm9wMTYoSFdORDE2LExQQ1NUUik7CiBIQU5ETEUzMiAgIEdldFByb3AzMkEoSFdORDMyLExQQ1NUUik7CiBIQU5ETEUzMiAgIEdldFByb3AzMlcoSFdORDMyLExQQ1dTVFIpOwpAQCAtNTA5OSw2ICs1MzUxLDE0IEBACiBIV05EMTYgICAgIFdpbmRvd0Zyb21Qb2ludDE2KFBPSU5UMTYpOwogSFdORDMyICAgICBXaW5kb3dGcm9tUG9pbnQzMihQT0lOVDMyKTsKICNkZWZpbmUgICAgV2luZG93RnJvbVBvaW50IFdJTkVMSUJfTkFNRShXaW5kb3dGcm9tUG9pbnQpCitCT09MMTYgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcxNihMUENTVFIsTFBDU1RSLExQQ1NUUixMUENTVFIpOworQk9PTDMyICAgICBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSLExQQ1NUUik7CitCT09MMzIgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcoTFBDV1NUUixMUENXU1RSLExQQ1dTVFIsTFBDV1NUUik7CisjZGVmaW5lICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcgV0lORUxJQl9OQU1FX0FXKFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcpCitCT09MMTYgICAgIFdyaXRlUHJvZmlsZVN0cmluZzE2KExQQ1NUUixMUENTVFIsTFBDU1RSKTsKK0JPT0wzMiAgICAgV3JpdGVQcm9maWxlU3RyaW5nMzJBKExQQ1NUUixMUENTVFIsTFBDU1RSKTsKK0JPT0wzMiAgICAgV3JpdGVQcm9maWxlU3RyaW5nMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSKTsKKyNkZWZpbmUgICAgV3JpdGVQcm9maWxlU3RyaW5nIFdJTkVMSUJfTkFNRV9BVyhXcml0ZVByb2ZpbGVTdHJpbmcpCiBTRUdQVFIgICAgIGxzdHJjYXQxNihTRUdQVFIsU0VHUFRSKTsKIExQU1RSICAgICAgbHN0cmNhdDMyQShMUFNUUixMUENTVFIpOwogTFBXU1RSICAgICBsc3RyY2F0MzJXKExQV1NUUixMUENXU1RSKTsKQEAgLTUyMzgsNyArNTQ5OCw2IEBACiBCT09MICAgICAgIERlc3Ryb3lNZW51KEhNRU5VMTYpOwogQk9PTCAgICAgICBEZXN0cm95V2luZG93KEhXTkQpOwogTE9ORyAgICAgICBEaXNwYXRjaE1lc3NhZ2UoY29uc3QgTVNHMTYqKTsKLUlOVCAgICAgICAgRGxnRGlyTGlzdChIV05ELFNFR1BUUixJTlQsSU5ULFVJTlQpOwogQk9PTDE2ICAgICBEcmFnRGV0ZWN0KEhXTkQxNixQT0lOVDE2KTsKIERXT1JEICAgICAgRHJhZ09iamVjdChIV05ELCBIV05ELCBXT1JELCBIQU5ETEUxNiwgV09SRCwgSENVUlNPUjE2KTsKIEJPT0wgICAgICAgRHJhd0ljb24oSERDMTYsSU5ULElOVCxISUNPTjE2KTsKQEAgLTUyNDksNyArNTUwOCw2IEBACiBCT09MICAgICAgIEVuYWJsZVdpbmRvdyhIV05ELEJPT0wpOwogQk9PTCAgICAgICBFbmREZWZlcldpbmRvd1BvcyhIRFdQMTYpOwogVUlOVDE2ICAgICBFbnVtQ2xpcGJvYXJkRm9ybWF0cyhVSU5UMTYpOwotSU5UICAgICAgICBFbnVtRm9udHMoSERDMTYsTFBDU1RSLEZPTlRFTlVNUFJPQzE2LExQQVJBTSk7CiBCT09MICAgICAgIEVudW1NZXRhRmlsZShIREMxNixITUVUQUZJTEUxNixNRkVOVU1QUk9DMTYsTFBBUkFNKTsKIElOVCAgICAgICAgRXNjYXBlKEhEQzE2LElOVCxJTlQsU0VHUFRSLFNFR1BUUik7CiBCT09MICAgICAgIEV4aXRXaW5kb3dzKERXT1JELFdPUkQpOwpAQCAtNTI3MSw3ICs1NTI5LDYgQEAKIERXT1JEICAgICAgR2V0QnJ1c2hPcmcoSERDMTYpOwogQk9PTCAgICAgICBHZXRDaGFyQUJDV2lkdGhzKEhEQzE2LFVJTlQsVUlOVCxMUEFCQzE2KTsKIEJPT0wgICAgICAgR2V0Q2hhcldpZHRoKEhEQzE2LFdPUkQsV09SRCxMUElOVDE2KTsKLUhSR04zMiAgICAgR2V0Q2xpcFJnbihIREMxNik7CiBIQU5ETEUxNiAgIEdldENsaXBib2FyZERhdGEoV09SRCk7CiBpbnQgICAgICAgIEdldENsaXBib2FyZEZvcm1hdE5hbWUoV09SRCxMUFNUUixzaG9ydCk7CiBIV05EICAgICAgIEdldENsaXBib2FyZE93bmVyKHZvaWQpOwpAQCAtNTI4MCw3ICs1NTM3LDYgQEAKIERXT1JEICAgICAgR2V0Q3VycmVudFBvc2l0aW9uKEhEQzE2KTsKIERXT1JEICAgICAgR2V0Q3VycmVudFRpbWUodm9pZCk7CiBIQ1VSU09SMTYgIEdldEN1cnNvcih2b2lkKTsKLURXT1JEICAgICAgR2V0RENPcmcoSERDMTYpOwogSERDMTYgICAgICBHZXREQ1N0YXRlKEhEQzE2KTsKIGludCAgICAgICAgR2V0RElCaXRzKEhEQzE2LEhCSVRNQVAxNixXT1JELFdPUkQsTFBTVFIsTFBCSVRNQVBJTkZPLFdPUkQpOwogU0VHUFRSICAgICBHZXRET1NFbnZpcm9ubWVudCh2b2lkKTsKQEAgLTUzMjMsMTAgKzU1NzksNiBAQAogV09SRCAgICAgICBHZXRQYWxldHRlRW50cmllcyhIUEFMRVRURTE2LFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CiBXT1JEICAgICAgIEdldFBvbHlGaWxsTW9kZShIREMxNik7CiBpbnQgICAgICAgIEdldFByaW9yaXR5Q2xpcGJvYXJkRm9ybWF0KFdPUkQqLHNob3J0KTsKLVVJTlQgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVJbnQoTFBDU1RSLExQQ1NUUixJTlQsTFBDU1RSKTsKLUlOVCAgICAgICAgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoTFBDU1RSLExQQ1NUUixMUENTVFIsTFBTVFIsSU5ULExQQ1NUUik7Ci1VSU5UICAgICAgIEdldFByb2ZpbGVJbnQoTFBDU1RSLExQQ1NUUixJTlQpOwotSU5UICAgICAgICBHZXRQcm9maWxlU3RyaW5nKExQQ1NUUixMUENTVFIsTFBDU1RSLExQU1RSLElOVCk7CiBEV09SRCAgICAgIEdldFF1ZXVlU3RhdHVzKFVJTlQpOwogQk9PTCAgICAgICBHZXRSYXN0ZXJpemVyQ2FwcyhMUFJBU1RFUklaRVJfU1RBVFVTLFVJTlQpOwogV09SRCAgICAgICBHZXRST1AyKEhEQzE2KTsKQEAgLTU0ODQsOSArNTczNiw2IEBACiBpbnQgICAgICAgIFdhaXRTb3VuZFN0YXRlKGludCk7CiBISU5TVEFOQ0UxNiBXaW5FeGVjKExQU1RSLFdPUkQpOwogQk9PTCAgICAgICBXaW5IZWxwKEhXTkQsTFBTVFIsV09SRCxEV09SRCk7Ci12b2lkICAgICAgIFdyaXRlT3V0UHJvZmlsZXModm9pZCk7Ci1CT09MICAgICAgIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmcoTFBDU1RSLExQQ1NUUixMUENTVFIsTFBDU1RSKTsKLUJPT0wgICAgICAgV3JpdGVQcm9maWxlU3RyaW5nKExQQ1NUUixMUENTVFIsTFBDU1RSKTsKIAogI2VuZGlmICAvKiBOT19UUkFOU0lUSU9OX1RZUEVTICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lubmxzLmggYi9pbmNsdWRlL3dpbm5scy5oCmluZGV4IDY3OTFmZDMuLjA0YzkyZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubmxzLmgKKysrIGIvaW5jbHVkZS93aW5ubHMuaApAQCAtMSw2ICsxLDkgQEAKICNpZm5kZWYgX19XSU5FX1dJTk5MU19ICiAjZGVmaW5lIF9fV0lORV9XSU5OTFNfSAogCisvKiBXaGVuIGFkZGluZyBuZXcgZGVmaW5lcywgZG9uJ3QgZm9yZ2V0IHRvIGFkZCBhbiBlbnRyeSB0byB0aGUKKyAqIGxvY2FsZTJpZCBtYXAgaW4gbWlzYy9vbGUybmxzLmMKKyAqLwogI2RlZmluZSBMT0NBTEVfSUxBTkdVQUdFICAgICAgICAgICAgMHgwMDAwMDAwMSAgIAogI2RlZmluZSBMT0NBTEVfU0xBTkdVQUdFICAgICAgICAgICAgMHgwMDAwMDAwMiAgIAogI2RlZmluZSBMT0NBTEVfU0VOR0xBTkdVQUdFICAgICAgICAgMHgwMDAwMTAwMSAgIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5wcm9jLmggYi9pbmNsdWRlL3dpbnByb2MuaAppbmRleCBmNWNlNGY1Li4xYTViYTExIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnByb2MuaAorKysgYi9pbmNsdWRlL3dpbnByb2MuaApAQCAtNTAsOSArNTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0gKTsKIGV4dGVybiB2b2lkIFdJTlBST0NfVW5tYXBNc2cxNlRvMzJXKCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOwotZXh0ZXJuIHZvaWQgV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYoIFVJTlQxNiBtc2csIFdQQVJBTTE2IHdQYXJhbSwKK2V4dGVybiB2b2lkIFdJTlBST0NfVW5tYXBNc2czMkFUbzE2KCBVSU5UMzIgbXNnLCBXUEFSQU0xNiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOwotZXh0ZXJuIHZvaWQgV0lOUFJPQ19Vbm1hcE1zZzMyV1RvMTYoIFVJTlQxNiBtc2csIFdQQVJBTTE2IHdQYXJhbSwKK2V4dGVybiB2b2lkIFdJTlBST0NfVW5tYXBNc2czMldUbzE2KCBVSU5UMzIgbXNnLCBXUEFSQU0xNiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5QUk9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luc29jay5oIGIvaW5jbHVkZS93aW5zb2NrLmgKaW5kZXggOTU0ODIyOS4uOTExOWMwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5zb2NrLmgKKysrIGIvaW5jbHVkZS93aW5zb2NrLmgKQEAgLTE2LDI2ICsxNiwxMTIgQEAKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogCi0vKgotICogVGhlIG5ldyB0eXBlIHRvIGJlIHVzZWQgaW4gYWxsCi0gKiBpbnN0YW5jZXMgd2hpY2ggcmVmZXIgdG8gc29ja2V0cy4KLSAqLwotdHlwZWRlZiB1X2ludAlTT0NLRVQ7Ci0KLWV4dGVybiBpbnQgX19XU0FGRElzU2V0KFNPQ0tFVCwgZmRfc2V0ICopOwotCi0vKgotICogSW50ZXJuZXQgYWRkcmVzcyAob2xkIHN0eWxlLi4uIHNob3VsZCBiZSB1cGRhdGVkKQotICovCi0jaWZkZWYgV1NfVVNFX09MRF9TVFlMRQotI2RlZmluZSBzX2FkZHIgIFNfdW4uU19hZGRyCS8qIGNhbiBiZSB1c2VkIGZvciBtb3N0IHRjcCAmIGlwIGNvZGUgKi8KLSNkZWZpbmUgc19ob3N0ICBTX3VuLlNfdW5fYi5zX2IyCS8qIGhvc3Qgb24gaW1wICovCi0jZGVmaW5lIHNfbmV0ICAgU191bi5TX3VuX2Iuc19iMQkvKiBuZXR3b3JrICovCi0jZGVmaW5lIHNfaW1wICAgU191bi5TX3VuX3cuc193MgkvKiBpbXAgKi8KLSNkZWZpbmUgc19pbXBubyBTX3VuLlNfdW5fYi5zX2I0CS8qIGltcCAjICovCi0jZGVmaW5lIHNfbGggICAgU191bi5TX3VuX2Iuc19iMwkvKiBsb2dpY2FsIGhvc3QgKi8KKyNpZm5kZWYgV0lORUxJQgorI3ByYWdtYSBwYWNrKDEpICAgICAgICAgICAgICAgICAvKiB0aWdodCBhbGlnbm1lbnQgZm9yIHRoZSBlbXVsYXRvciAqLwogI2VuZGlmCiAKKy8qIFdpbjE2IHNvY2tldC1yZWxhdGVkIHR5cGVzICovCisKK3R5cGVkZWYgVUlOVDE2CQlTT0NLRVQxNjsKKwordHlwZWRlZiBzdHJ1Y3Qgd3NfaG9zdGVudAoreworICAgICAgICBTRUdQVFIgIGhfbmFtZTsgICAgICAgICAvKiBvZmZpY2lhbCBuYW1lIG9mIGhvc3QgKi8KKyAgICAgICAgU0VHUFRSICBoX2FsaWFzZXM7ICAgICAgLyogYWxpYXMgbGlzdCAqLworICAgICAgICBJTlQxNiAgIGhfYWRkcnR5cGU7ICAgICAvKiBob3N0IGFkZHJlc3MgdHlwZSAqLworICAgICAgICBJTlQxNiAgIGhfbGVuZ3RoOyAgICAgICAvKiBsZW5ndGggb2YgYWRkcmVzcyAqLworICAgICAgICBTRUdQVFIgIGhfYWRkcl9saXN0OyAgICAvKiBsaXN0IG9mIGFkZHJlc3NlcyBmcm9tIG5hbWUgc2VydmVyICovCit9IF93c19ob3N0ZW50OworCit0eXBlZGVmIHN0cnVjdCB3c19wcm90b2VudAoreworICAgICAgICBTRUdQVFIgIHBfbmFtZTsgICAgICAgICAvKiBvZmZpY2lhbCBwcm90b2NvbCBuYW1lICovCisgICAgICAgIFNFR1BUUiAgcF9hbGlhc2VzOyAgICAgIC8qIGFsaWFzIGxpc3QgKi8KKyAgICAgICAgSU5UMTYgICBwX3Byb3RvOyAgICAgICAgLyogcHJvdG9jb2wgIyAqLworfSBfd3NfcHJvdG9lbnQ7CisKK3R5cGVkZWYgc3RydWN0IHdzX3NlcnZlbnQgCit7CisgICAgICAgIFNFR1BUUiAgc19uYW1lOyAgICAgICAgIC8qIG9mZmljaWFsIHNlcnZpY2UgbmFtZSAqLworICAgICAgICBTRUdQVFIgIHNfYWxpYXNlczsgICAgICAvKiBhbGlhcyBsaXN0ICovCisgICAgICAgIElOVDE2ICAgc19wb3J0OyAgICAgICAgIC8qIHBvcnQgIyAqLworICAgICAgICBTRUdQVFIgIHNfcHJvdG87ICAgICAgICAvKiBwcm90b2NvbCB0byB1c2UgKi8KK30gX3dzX3NlcnZlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHdzX25ldGVudAoreworICAgICAgICBTRUdQVFIgIG5fbmFtZTsgICAgICAgICAvKiBvZmZpY2lhbCBuYW1lIG9mIG5ldCAqLworICAgICAgICBTRUdQVFIgIG5fYWxpYXNlczsgICAgICAvKiBhbGlhcyBsaXN0ICovCisgICAgICAgIElOVDE2ICAgbl9hZGRydHlwZTsgICAgIC8qIG5ldCBhZGRyZXNzIHR5cGUgKi8KKyAgICAgICAgSU5UMzIgICBuX25ldDsgICAgICAgICAgLyogbmV0d29yayAjICovCit9IF93c19uZXRlbnQ7CisKK3R5cGVkZWYgc3RydWN0IHNvY2thZGRyCQl3c19zb2NrYWRkcjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgVUlOVDE2ICAgIGZkX2NvdW50OyAgICAgICAgICAgICAgIC8qIGhvdyBtYW55IGFyZSBTRVQ/ICovCisgICAgICAgIFNPQ0tFVDE2ICBmZF9hcnJheVtGRF9TRVRTSVpFXTsgICAvKiBhbiBhcnJheSBvZiBTT0NLRVRzICovCit9IHdzX2ZkX3NldDsKKworLyogd3NfZmRfc2V0IG9wZXJhdGlvbnMgKi8KKworSU5UMTYgICBfX1dTQUZESXNTZXQoIFNPQ0tFVDE2LCB3c19mZF9zZXQgKiApOworCisjZGVmaW5lIFdTX0ZEX0NMUihmZCwgc2V0KSBkbyB7IFwKKyAgICBVSU5UMTYgX19pOyBcCisgICAgZm9yIChfX2kgPSAwOyBfX2kgPCAoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9jb3VudCA7IF9faSsrKSBcCisgICAgeyBcCisgICAgICAgIGlmICgoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9hcnJheVtfX2ldID09IGZkKSBcCisJeyBcCisgICAgICAgICAgICB3aGlsZSAoX19pIDwgKCh3c19mZF9zZXQqKShzZXQpKS0+ZmRfY291bnQtMSkgXAorCSAgICB7IFwKKyAgICAgICAgICAgICAgICAoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9hcnJheVtfX2ldID0gXAorICAgICAgICAgICAgICAgICAgICAoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9hcnJheVtfX2krMV07IFwKKyAgICAgICAgICAgICAgICBfX2krKzsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9jb3VudC0tOyBcCisgICAgICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBXU19GRF9TRVQoZmQsIHNldCkgZG8geyBcCisgICAgaWYgKCgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2NvdW50IDwgRkRfU0VUU0laRSkgXAorICAgICAgICAoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9hcnJheVsoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9jb3VudCsrXT0oZmQpO1wKK30gd2hpbGUoMCkKKworI2RlZmluZSBXU19GRF9aRVJPKHNldCkgKCgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2NvdW50PTApCisKKyNkZWZpbmUgV1NfRkRfSVNTRVQoZmQsIHNldCkgX19XU0FGRElzU2V0KChTT0NLRVQxNikoZmQpLCAod3NfZmRfc2V0Kikoc2V0KSkKKworLyogCisgKiBJbnRlcm5ldCBhZGRyZXNzIChvbGQgc3R5bGUuLi4gc2hvdWxkIGJlIHVwZGF0ZWQpIAorICovCisKK3R5cGVkZWYgc3RydWN0IHdzX2FkZHJfaW4KK3sKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7IEJZVEUgICBzX2IxLHNfYjIsc19iMyxzX2I0OyB9IFNfdW5fYjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeyBVSU5UMTYgc193MSxzX3cyOyB9IFNfdW5fdzsKKyAgICAgICAgICAgICAgICBVSU5UMzIgU19hZGRyOworICAgICAgICB9IFNfdW47CisjZGVmaW5lIHdzX2FkZHIgIFNfdW4uU19hZGRyCQkvKiBjYW4gYmUgdXNlZCBmb3IgbW9zdCB0Y3AgJiBpcCBjb2RlICovCisjZGVmaW5lIHdzX2hvc3QgIFNfdW4uU191bl9iLnNfYjIJLyogaG9zdCBvbiBpbXAgKi8KKyNkZWZpbmUgd3NfbmV0ICAgU191bi5TX3VuX2Iuc19iMQkvKiBuZXR3b3JrICovCisjZGVmaW5lIHdzX2ltcCAgIFNfdW4uU191bl93LnNfdzIJLyogaW1wICovCisjZGVmaW5lIHdzX2ltcG5vIFNfdW4uU191bl9iLnNfYjQJLyogaW1wICMgKi8KKyNkZWZpbmUgd3NfbGggICAgU191bi5TX3VuX2Iuc19iMwkvKiBsb2dpY2FsIGhvc3QgKi8KK30gX3dzX2luX2FkZHI7CisKK3R5cGVkZWYgc3RydWN0IHdzX3NvY2thZGRyX2luCit7CisgICAgICAgIElOVDE2CQlzaW5fZmFtaWx5OworICAgICAgICBVSU5UMTYgCQlzaW5fcG9ydDsKKyAgICAgICAgX3dzX2luX2FkZHIgCXNpbl9hZGRyOworICAgICAgICBjaGFyICAgIAlzaW5femVyb1s4XTsKK30gX3dzX3NvY2thZGRyX2luOworCiAjZGVmaW5lIFdTQURFU0NSSVBUSU9OX0xFTiAgICAgIDI1NgogI2RlZmluZSBXU0FTWVNfU1RBVFVTX0xFTiAgICAgICAxMjgKIApAQCAtNDQsMjQgKzEzMCw3OSBAQAogICAgICAgICBXT1JEICAgICAgICAgICAgICAgICAgICB3SGlnaFZlcnNpb247CiAgICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIHN6RGVzY3JpcHRpb25bV1NBREVTQ1JJUFRJT05fTEVOKzFdOwogICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBzelN5c3RlbVN0YXR1c1tXU0FTWVNfU1RBVFVTX0xFTisxXTsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgaU1heFNvY2tldHM7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlNYXhVZHBEZzsKLSAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAqbHBWZW5kb3JJbmZvOworICAgICAgICBVSU5UMTYJCQlpTWF4U29ja2V0czsKKyAgICAgICAgVUlOVDE2CQkJaU1heFVkcERnOworICAgICAgICBTRUdQVFIJCQlscFZlbmRvckluZm87CiB9IFdTQURBVEEsICpMUFdTQURBVEE7CiAKKyNpZm5kZWYgV0lORUxJQgorI3ByYWdtYSBwYWNrKDQpCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm8gV2luMTYgc3RydWN0dXJlIGRlZnMgYmV5b25kIHRoaXMgbGluZSEgKi8KKwogLyoKICAqIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIC0xLCBzaW5jZSB0aGUKICAqIFNPQ0tFVCB0eXBlIGlzIHVuc2lnbmVkLgogICovCi0jZGVmaW5lIElOVkFMSURfU09DS0VUICAoU09DS0VUKSh+MCkKLSNkZWZpbmUgU09DS0VUX0VSUk9SICAgICAgICAgICAgKC0xKQorI2RlZmluZSBJTlZBTElEX1NPQ0tFVCAgKFNPQ0tFVDE2KSh+MCkKKyNkZWZpbmUgU09DS0VUX0VSUk9SICAgICAgICAgICAgICAoLTEpCisKKy8qCisgKiBUeXBlcworICovCisjZGVmaW5lIFdTX1NPQ0tfU1RSRUFNICAgICAxICAgICAgICAgICAgICAgLyogc3RyZWFtIHNvY2tldCAqLworI2RlZmluZSBXU19TT0NLX0RHUkFNICAgICAgMiAgICAgICAgICAgICAgIC8qIGRhdGFncmFtIHNvY2tldCAqLworI2RlZmluZSBXU19TT0NLX1JBVyAgICAgICAgMyAgICAgICAgICAgICAgIC8qIHJhdy1wcm90b2NvbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgV1NfU09DS19SRE0gICAgICAgIDQgICAgICAgICAgICAgICAvKiByZWxpYWJseS1kZWxpdmVyZWQgbWVzc2FnZSAqLworI2RlZmluZSBXU19TT0NLX1NFUVBBQ0tFVCAgNSAgICAgICAgICAgICAgIC8qIHNlcXVlbmNlZCBwYWNrZXQgc3RyZWFtICovCisKKyNkZWZpbmUgV1NfU09MX1NPQ0tFVAkJKC0xKQorI2RlZmluZSBXU19JUFBST1RPX1RDUAkJNgogCiAvKgogICogT3B0aW9uIGZsYWdzIHBlci1zb2NrZXQuCiAgKi8KLSNpZm5kZWYgU09fRE9OVExJTkdFUgotI2RlZmluZSBTT19ET05UTElOR0VSICAgKHVfaW50KSh+U09fTElOR0VSKQotI2VuZGlmCisjZGVmaW5lIFdTX1NPX0RFQlVHICAgICAgICAweDAwMDEgICAgICAgICAgLyogdHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyByZWNvcmRpbmcgKi8KKyNkZWZpbmUgV1NfU09fQUNDRVBUQ09OTiAgIDB4MDAwMiAgICAgICAgICAvKiBzb2NrZXQgaGFzIGhhZCBsaXN0ZW4oKSAqLworI2RlZmluZSBXU19TT19SRVVTRUFERFIgICAgMHgwMDA0ICAgICAgICAgIC8qIGFsbG93IGxvY2FsIGFkZHJlc3MgcmV1c2UgKi8KKyNkZWZpbmUgV1NfU09fS0VFUEFMSVZFICAgIDB4MDAwOCAgICAgICAgICAvKiBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlICovCisjZGVmaW5lIFdTX1NPX0RPTlRST1VURSAgICAweDAwMTAgICAgICAgICAgLyoganVzdCB1c2UgaW50ZXJmYWNlIGFkZHJlc3NlcyAqLworI2RlZmluZSBXU19TT19CUk9BRENBU1QgICAgMHgwMDIwICAgICAgICAgIC8qIHBlcm1pdCBzZW5kaW5nIG9mIGJyb2FkY2FzdCBtc2dzICovCisjZGVmaW5lIFdTX1NPX1VTRUxPT1BCQUNLICAweDAwNDAgICAgICAgICAgLyogYnlwYXNzIGhhcmR3YXJlIHdoZW4gcG9zc2libGUgKi8KKyNkZWZpbmUgV1NfU09fTElOR0VSICAgICAgIDB4MDA4MCAgICAgICAgICAvKiBsaW5nZXIgb24gY2xvc2UgaWYgZGF0YSBwcmVzZW50ICovCisjZGVmaW5lIFdTX1NPX09PQklOTElORSAgICAweDAxMDAgICAgICAgICAgLyogbGVhdmUgcmVjZWl2ZWQgT09CIGRhdGEgaW4gbGluZSAqLworCisjZGVmaW5lIFdTX1NPX0RPTlRMSU5HRVIgICAoVUlOVDE2KSh+V1NfU09fTElOR0VSKQorCisvKgorICogQWRkaXRpb25hbCBvcHRpb25zLgorICovCisjZGVmaW5lIFdTX1NPX1NOREJVRiAgICAgICAweDEwMDEgICAgICAgICAgLyogc2VuZCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBXU19TT19SQ1ZCVUYgICAgICAgMHgxMDAyICAgICAgICAgIC8qIHJlY2VpdmUgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgV1NfU09fU05ETE9XQVQgICAgIDB4MTAwMyAgICAgICAgICAvKiBzZW5kIGxvdy13YXRlciBtYXJrICovCisjZGVmaW5lIFdTX1NPX1JDVkxPV0FUICAgICAweDEwMDQgICAgICAgICAgLyogcmVjZWl2ZSBsb3ctd2F0ZXIgbWFyayAqLworI2RlZmluZSBXU19TT19TTkRUSU1FTyAgICAgMHgxMDA1ICAgICAgICAgIC8qIHNlbmQgdGltZW91dCAqLworI2RlZmluZSBXU19TT19SQ1ZUSU1FTyAgICAgMHgxMDA2ICAgICAgICAgIC8qIHJlY2VpdmUgdGltZW91dCAqLworI2RlZmluZSBXU19TT19FUlJPUiAgICAgICAgMHgxMDA3ICAgICAgICAgIC8qIGdldCBlcnJvciBzdGF0dXMgYW5kIGNsZWFyICovCisjZGVmaW5lIFdTX1NPX1RZUEUgICAgICAgICAweDEwMDggICAgICAgICAgLyogZ2V0IHNvY2tldCB0eXBlICovCisKKyNkZWZpbmUgV1NfSU9DUEFSTV9NQVNLICAgIDB4N2YgICAgICAgICAgICAvKiBwYXJhbWV0ZXJzIG11c3QgYmUgPCAxMjggYnl0ZXMgKi8KKyNkZWZpbmUgV1NfSU9DX1ZPSUQgICAgICAgIDB4MjAwMDAwMDAgICAgICAvKiBubyBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFdTX0lPQ19PVVQgICAgICAgICAweDQwMDAwMDAwICAgICAgLyogY29weSBvdXQgcGFyYW1ldGVycyAqLworI2RlZmluZSBXU19JT0NfSU4gICAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8qIGNvcHkgaW4gcGFyYW1ldGVycyAqLworI2RlZmluZSBXU19JT0NfSU5PVVQgICAgICAgKFdTX0lPQ19JTnxXU19JT0NfT1VUKQorI2RlZmluZSBXU19JT1IoeCx5LHQpICAgICAgKFdTX0lPQ19PVVR8KCgoVUlOVDMyKXNpemVvZih0KSZXU19JT0NQQVJNX01BU0spPDwxNil8KCh4KTw8OCl8KHkpKQorI2RlZmluZSBXU19JT1coeCx5LHQpICAgICAgKFdTX0lPQ19JTnwoKChVSU5UMzIpc2l6ZW9mKHQpJldTX0lPQ1BBUk1fTUFTSyk8PDE2KXwoKHgpPDw4KXwoeSkpCisKKy8qCisgKiBTb2NrZXQgSS9PIGZsYWdzIChzdXBwb3J0ZWQgYnkgc3BlYyAxLjEpCisgKi8KKworI2RlZmluZSBXU19GSU9OUkVBRCAgICBXU19JT1IoJ2YnLCAxMjcsIHVfbG9uZykKKyNkZWZpbmUgV1NfRklPTkJJTyAgICAgV1NfSU9XKCdmJywgMTI2LCB1X2xvbmcpCisKKyNkZWZpbmUgV1NfU0lPQ0FUTUFSSyAgV1NfSU9SKCdzJywgIDcsIHVfbG9uZykKIAogLyoKICAqIE1heGltdW0gcXVldWUgbGVuZ3RoIHNwZWNpZmlhYmxlIGJ5IGxpc3Rlbi4KQEAgLTg0LDEyICsyMjUsMTcgQEAKIC8qCiAgKiBEZWZpbmUgZmxhZ3MgdG8gYmUgdXNlZCB3aXRoIHRoZSBXU0FBc3luY1NlbGVjdCgpIGNhbGwuCiAgKi8KLSNkZWZpbmUgRkRfUkVBRCAgICAgICAgIDB4MDEKLSNkZWZpbmUgRkRfV1JJVEUgICAgICAgIDB4MDIKLSNkZWZpbmUgRkRfT09CICAgICAgICAgIDB4MDQKLSNkZWZpbmUgRkRfQUNDRVBUICAgICAgIDB4MDgKLSNkZWZpbmUgRkRfQ09OTkVDVCAgICAgIDB4MTAKLSNkZWZpbmUgRkRfQ0xPU0UgICAgICAgIDB4MjAKKyNkZWZpbmUgV1NfRkRfUkVBRCAgICAgICAgIDB4MDEKKyNkZWZpbmUgV1NfRkRfV1JJVEUgICAgICAgIDB4MDIKKyNkZWZpbmUgV1NfRkRfT09CICAgICAgICAgIDB4MDQKKyNkZWZpbmUgV1NfRkRfQUNDRVBUICAgICAgIDB4MDgKKyNkZWZpbmUgV1NfRkRfQ09OTkVDVCAgICAgIDB4MTAKKyNkZWZpbmUgV1NfRkRfQ0xPU0UgICAgICAgIDB4MjAKKworI2RlZmluZSBXU19GRF9OT05CTE9DSwkgICAweDEwMDAwMDAwCS8qIGludGVybmFsIHBlci1zb2NrZXQgZmxhZ3MgKi8KKyNkZWZpbmUgV1NfRkRfSU5BQ1RJVkUJICAgMHgyMDAwMDAwMAorI2RlZmluZSBXU19GRF9DT05ORUNURUQJICAgMHg0MDAwMDAwMAorI2RlZmluZSBXU19GRF9JTlRFUk5BTAkgICAweEZGRkYwMDAwCiAKIC8qCiAgKiBBbGwgV2luZG93cyBTb2NrZXRzIGVycm9yIGNvbnN0YW50cyBhcmUgYmlhc2VkIGJ5IFdTQUJBU0VFUlIgZnJvbQpAQCAtMTkwLDI5ICszMzYsMzUgQEAKIAogLyogTWljcm9zb2Z0IFdpbmRvd3MgRXh0ZW5zaW9uIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIAotSU5UIFdTQVN0YXJ0dXAoV09SRCB3VmVyc2lvblJlcXVpcmVkLCBMUFdTQURBVEEgbHBXU0FEYXRhKTsKLUlOVCBXU0FDbGVhbnVwKHZvaWQpOwotdm9pZCBXU0FTZXRMYXN0RXJyb3IoSU5UIGlFcnJvcik7Ci1JTlQgV1NBR2V0TGFzdEVycm9yKHZvaWQpOwotQk9PTCBXU0FJc0Jsb2NraW5nKHZvaWQpOwotSU5UIFdTQVVuaG9va0Jsb2NraW5nSG9vayh2b2lkKTsKK0lOVDE2IAkgIFdTQVN0YXJ0dXAoVUlOVDE2IHdWZXJzaW9uUmVxdWlyZWQsIExQV1NBREFUQSBscFdTQURhdGEpOworSU5UMTYgCSAgV1NBQ2xlYW51cCh2b2lkKTsKK3ZvaWQgCSAgV1NBU2V0TGFzdEVycm9yKElOVDE2IGlFcnJvcik7CitJTlQxNiAJICBXU0FHZXRMYXN0RXJyb3Iodm9pZCk7CitCT09MMTYgCSAgV1NBSXNCbG9ja2luZyh2b2lkKTsKK0lOVDE2IAkgIFdTQVVuaG9va0Jsb2NraW5nSG9vayh2b2lkKTsKIEZBUlBST0MxNiBXU0FTZXRCbG9ja2luZ0hvb2soRkFSUFJPQzE2IGxwQmxvY2tGdW5jKTsKLUlOVCBXU0FDYW5jZWxCbG9ja2luZ0NhbGwodm9pZCk7Ci1IQU5ETEUxNiBXU0FBc3luY0dldFNlcnZCeU5hbWUoSFdORCBoV25kLCB1X2ludCB3TXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBMUENTVFIgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKTsKLUhBTkRMRTE2IFdTQUFzeW5jR2V0U2VydkJ5UG9ydChIV05EIGhXbmQsIHVfaW50IHdNc2csIElOVCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBwcm90bywgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKTsKLUhBTkRMRTE2IFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUoSFdORCBoV25kLCB1X2ludCB3TXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSwgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKTsKLUhBTkRMRTE2IFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcihIV05EIGhXbmQsIHVfaW50IHdNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bWJlciwgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKTsKLUhBTkRMRTE2IFdTQUFzeW5jR2V0SG9zdEJ5TmFtZShIV05EIGhXbmQsIHVfaW50IHdNc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUsIExQU1RSIGJ1ZiwgSU5UIGJ1Zmxlbik7Ci1IQU5ETEUxNiBXU0FBc3luY0dldEhvc3RCeUFkZHIoSFdORCBoV25kLCB1X2ludCB3TXNnLCBMUENTVFIgYWRkciwgSU5UIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHlwZSwgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKTsKLUlOVCBXU0FDYW5jZWxBc3luY1JlcXVlc3QoSEFORExFMTYgaEFzeW5jVGFza0hhbmRsZSk7Ci1JTlQgV1NBQXN5bmNTZWxlY3QoU09DS0VUIHMsIEhXTkQgaFduZCwgdV9pbnQgd01zZywgbG9uZyBsRXZlbnQpOworSU5UMTYgCSAgV1NBQ2FuY2VsQmxvY2tpbmdDYWxsKHZvaWQpOworSEFORExFMTYgIFdTQUFzeW5jR2V0U2VydkJ5TmFtZShIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBMUENTVFIgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CisKK0hBTkRMRTE2ICBXU0FBc3luY0dldFNlcnZCeVBvcnQoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBJTlQxNiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CisKK0hBTkRMRTE2ICBXU0FBc3luY0dldFByb3RvQnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworCitIQU5ETEUxNiAgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgbnVtYmVyLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworCitIQU5ETEUxNiAgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUsIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CisKK0hBTkRMRTE2ICBXU0FBc3luY0dldEhvc3RCeUFkZHIoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBMUENTVFIgYWRkciwgSU5UMTYgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiB0eXBlLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworCitJTlQxNiAJICBXU0FDYW5jZWxBc3luY1JlcXVlc3QoSEFORExFMTYgaEFzeW5jVGFza0hhbmRsZSk7CitJTlQxNiAgICAgV1NBQXN5bmNTZWxlY3QoU09DS0VUMTYgcywgSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBVSU5UMzIgbEV2ZW50KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CkBAIC0yNjcsNCArNDE5LDEyMSBAQAogICovCiAjZGVmaW5lIFdTQUdFVFNFTEVDVEVSUk9SKGxQYXJhbSkgICAgICAgICAgIEhJV09SRChsUGFyYW0pCiAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVybmFsIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBXU19EVVBfTkFUSVZFICAgICAgICAgICAweDAKKyNkZWZpbmUgV1NfRFVQX09GRlNFVCAgICAgICAgICAgMHgyCisjZGVmaW5lIFdTX0RVUF9TRUdQVFIgICAgICAgICAgIDB4NAorCisjZGVmaW5lIEFPUF9JTyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMQkvKiBhb3BfY29udHJvbCBwYXJhbWF0ZXJzICovCisKKyNkZWZpbmUgQU9QX0NPTlRST0xfUkVNT1ZFICAgICAgMHgwMDAwMDAwCS8qIGFvcF9jb250cm9sIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgQU9QX0NPTlRST0xfS0VFUCAgICAgICAgMHgwMDAwMDAxCisKK3R5cGVkZWYgc3RydWN0ICBfX2FvcAoreworICAvKiBBT3AgaGVhZGVyICovCisKKyAgc3RydWN0IF9fYW9wICpuZXh0LCAqcHJldjsKKyAgaW50ICAgICAgICAgICBmZFsyXTsJCQkJLyogcGlwZSAqLworICBpbnQgICAoKmFvcF9jb250cm9sKShzdHJ1Y3QgX19hb3AqLCBpbnQpOwkvKiBTSUdJTyBoYW5kbGVyICovCisgIHBpZF90ICAgICAgICAgcGlkOwkJCS8qIGNoaWxkIHByb2Nlc3MgcGlkICovCisKKyAgLyogY3VzdG9tIGRhdGEgKi8KKworICBIV05EMTYgICAgICAgIGhXbmQ7CisgIFVJTlQxNiAgICAgICAgdU1zZzsKKworICB1bnNpZ25lZAlmbGFnczsKKyAgU0VHUFRSCWJ1ZmZlcl9iYXNlOworICBpbnQgICAgICAgICAgIGJ1ZmxlbjsKKyAgY2hhciogICAgICAgICBpbml0OwkJCS8qIHBhcmFtZXRlciBkYXRhIC0gbGVuZ3RoIGlzIGluIHRoZSBhc3luY19jdGwgKi8KK30gd3NfYXN5bmNfb3A7CisKKyNkZWZpbmUgV1NNU0dfQVNZTkNfU0VMRUNUICAgICAgMHgwMDAwMDAxCisjZGVmaW5lIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUgIDB4MDAwMDAxMAorI2RlZmluZSBXU01TR19BU1lOQ19IT1NUQllBRERSICAweDAwMDAwMjAKKyNkZWZpbmUgV1NNU0dfQVNZTkNfUFJPVE9CWU5BTUUgMHgwMDAwMTAwCisjZGVmaW5lIFdTTVNHX0FTWU5DX1BST1RPQllOVU0gIDB4MDAwMDIwMAorI2RlZmluZSBXU01TR19BU1lOQ19TRVJWQllOQU1FICAweDAwMDEwMDAKKyNkZWZpbmUgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCAgMHgwMDAyMDAwCisKKyNkZWZpbmUgTVRZUEVfUEFSRU5UICAgICAgICAgICAgMHg1MDUwNTM1NworI2RlZmluZSBNVFlQRV9DTElFTlQgICAgICAgICAgICAweDUwNDM1MzU3CisKKyNwcmFnbWEgcGFjaygxKQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgbG9uZyAgICAgICAgICBtdHlwZTsgICAgICAgICAgLyogV1NNU0dfLi4uICovCisKKyAgVUlOVDMyICAgICAgICBsUGFyYW07CisgIFVJTlQxNiAgICAgICAgd1BhcmFtOyAgICAgICAgIC8qIHNvY2tldCBoYW5kbGUgKi8KK30gaXBjX3BhY2tldDsKKworI2RlZmluZSBNVFlQRV9QQVJFTlRfU0laRSBcCisgICAgICAgIChzaXplb2YoVUlOVDMyKSkKKyNkZWZpbmUgTVRZUEVfQ0xJRU5UX1NJWkUgXAorICAgICAgICAoc2l6ZW9mKGlwY19wYWNrZXQpIC0gc2l6ZW9mKGxvbmcpKQorI3ByYWdtYSBwYWNrKDQpCisKK3R5cGVkZWYgc3RydWN0Cit7CisgIGludCAgICAgICAgICAgICAgICAgICBmZDsKKyAgdW5zaWduZWQgICAgICAgICAgICAgIGZsYWdzOworICB3c19hc3luY19vcCogICAgICAgICAgcF9hb3A7Cit9IHdzX3NvY2tldDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgd3NfYXN5bmNfb3AqICB3c19hb3A7ICAgICAgICAgLyogaW5pdCdlZCBmb3IgZ2V0WGJ5WSAqLworICB3c19zb2NrZXQqICAgIHdzX3NvY2s7ICAgICAgICAvKiBpbml0J2VkIGZvciBBc3luY1NlbGVjdCAqLworICBpbnQgICAgICAgICAgIGxFdmVudDsKKyAgaW50ICAgICAgICAgICBsTGVuZ3RoOworICBjaGFyKgkJYnVmZmVyOworICBpcGNfcGFja2V0ICAgIGlwOworfSB3c19hc3luY19jdGw7CisKKyNkZWZpbmUgV1NfTUFYX1NPQ0tFVFNfUEVSX1RIUkVBRCAgICAgICAxNgorI2RlZmluZSBXU19NQVhfVURQX0RBVEFHUkFNICAgICAgICAgICAgIDEwMjQKKworI2RlZmluZSBXU0lfQkxPQ0tJTkdDQUxMCTB4MDAwMDAwMDEJLyogcGVyLXRocmVhZCBpbmZvIGZsYWdzICovCisKK3R5cGVkZWYgc3RydWN0IF9fV1NJTkZPCit7CisgIHN0cnVjdCBfX1dTSU5GTyogICAgICBwcmV2LCpuZXh0OworCisgIHVuc2lnbmVkCQlmbGFnczsKKyAgaW50CQkJZXJybm87CisgIGludAkJCW51bV9zdGFydHVwOworICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2FzeW5jX3JxOworICBpbnQgICAgICAgICAgICAgICAgICAgbGFzdF9mcmVlOworICB3c19zb2NrZXQgICAgICAgICAgICAgc29ja1tXU19NQVhfU09DS0VUU19QRVJfVEhSRUFEXTsKKyAgaW50CQkJYnVmbGVuOworICBjaGFyKgkJCWJ1ZmZlcjsKKyAgRkFSUFJPQzE2CQlibG9ja2luZ19ob29rOworICBIVEFTSzE2ICAgICAgICAgICAgICAgdGlkOyAgICAvKiBvd25pbmcgdGhyZWFkIGlkIC0gYmV0dGVyIHN3aXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBUTFMgd2hlbiBpdCBnZXRzIGZpeGVkICovCit9IFdTSU5GTywgKkxQV1NJTkZPOworCitpbnQgV1NfZHVwX2hlKExQV1NJTkZPIHB3c2ksIHN0cnVjdCBob3N0ZW50KiBwX2hlLCBpbnQgZmxhZyk7CitpbnQgV1NfZHVwX3BlKExQV1NJTkZPIHB3c2ksIHN0cnVjdCBwcm90b2VudCogcF9wZSwgaW50IGZsYWcpOworaW50IFdTX2R1cF9zZShMUFdTSU5GTyBwd3NpLCBzdHJ1Y3Qgc2VydmVudCogcF9zZSwgaW50IGZsYWcpOworCit2b2lkIFdTX2RvX2FzeW5jX2dldGhvc3QoTFBXU0lORk8sIHVuc2lnbmVkKTsKK3ZvaWQgV1NfZG9fYXN5bmNfZ2V0cHJvdG8oTFBXU0lORk8sIHVuc2lnbmVkKTsKK3ZvaWQgV1NfZG9fYXN5bmNfZ2V0c2VydihMUFdTSU5GTywgdW5zaWduZWQpOworCitpbnQgV0lOU09DS19hc3luY19pbyhpbnQgZmQsIGludCBhc3luYyk7CitpbnQgV0lOU09DS191bmJsb2NrX2lvKGludCBmZCwgaW50IG5vYmxvY2spOworCitpbnQgIFdJTlNPQ0tfY2hlY2tfYXN5bmNfb3Aod3NfYXN5bmNfb3AqIHBfYW9wKTsKK3ZvaWQgV0lOU09DS19saW5rX2FzeW5jX29wKHdzX2FzeW5jX29wKiBwX2FvcCk7Cit2b2lkIFdJTlNPQ0tfdW5saW5rX2FzeW5jX29wKHdzX2FzeW5jX29wKiBwX2FvcCk7Cit2b2lkIFdJTlNPQ0tfY2FuY2VsX2FzeW5jX29wKEhUQVNLMTYgdGlkKTsKK3ZvaWQgV0lOU09DS19kb19hc3luY19zZWxlY3Qodm9pZCk7CisKK1VJTlQxNiB3c2FFcnJubyh2b2lkKTsKK1VJTlQxNiB3c2FIZXJybm8odm9pZCk7CisKICNlbmRpZiAgLyogX1dJTlNPQ0tBUElfICovCisKZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWlzY3N0dWJzLmMgYi9saWJyYXJ5L21pc2NzdHVicy5jCmluZGV4IDQ1ZjhiZDcuLjZhN2NkYTEgMTAwNjQ0Ci0tLSBhL2xpYnJhcnkvbWlzY3N0dWJzLmMKKysrIGIvbGlicmFyeS9taXNjc3R1YnMuYwpAQCAtMTMsNiArMTMsMTEgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAordm9pZCBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBCT09MMzIgbWFzayApCit7CisgICAgLyogRklYTUU6IHNpZ25hbHMgZG9uJ3Qgd29yayBpbiB0aGUgbGlicmFyeSAqLworfQorCiBpbnQgQ2FsbFRvMzJfTGFyZ2VTdGFjayggaW50ICgqZnVuYykoKSwgaW50IG5iYXJncywgLi4uKQogewogICB2YV9saXN0IGFyZ2xpc3Q7CkBAIC00OSw3ICs1NCw2IEBACiBleHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaW5kVGV4dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7Ci1leHRlcm4gTFJFU1VMVCBMaXN0Qm94V25kUHJvYyhIV05ELFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIE1ESUNsaWVudFduZFByb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwogZXh0ZXJuIExSRVNVTFQgUHJpbnREbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwpAQCAtNzcsNyArODEsNiBAQAogICBNQVBfU1RSX1RPX1BST0MoIkZpbGVPcGVuRGxnUHJvYyIsRmlsZU9wZW5EbGdQcm9jKTsKICAgTUFQX1NUUl9UT19QUk9DKCJGaWxlU2F2ZURsZ1Byb2MiLEZpbGVTYXZlRGxnUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiRmluZFRleHREbGdQcm9jIixGaW5kVGV4dERsZ1Byb2MpOwotICBNQVBfU1RSX1RPX1BST0MoIkxpc3RCb3hXbmRQcm9jIixMaXN0Qm94V25kUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiTURJQ2xpZW50V25kUHJvYyIsTURJQ2xpZW50V25kUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiUG9wdXBNZW51V25kUHJvYyIsUG9wdXBNZW51V25kUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiUHJpbnREbGdQcm9jIixQcmludERsZ1Byb2MpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21haW4uYyBiL2xvYWRlci9tYWluLmMKaW5kZXggYWRhMjkzNC4uOGNhYzk3NiAxMDA2NDQKLS0tIGEvbG9hZGVyL21haW4uYworKysgYi9sb2FkZXIvbWFpbi5jCkBAIC0xNDksMTEgKzE0OSwxMSBAQAogICAgIGlmICghS0VSTjMyX0luaXQoKSkgcmV0dXJuIDA7CiAKICAgICAgIC8qIENyZWF0ZSBzeXN0ZW0gbWVzc2FnZSBxdWV1ZSAqLwotICAgIHF1ZXVlU2l6ZSA9IEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIlR5cGVBaGVhZCIsIDEyMCApOworICAgIHF1ZXVlU2l6ZSA9IEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwgIlR5cGVBaGVhZCIsIDEyMCApOwogICAgIGlmICghUVVFVUVfQ3JlYXRlU3lzTXNnUXVldWUoIHF1ZXVlU2l6ZSApKSByZXR1cm4gMDsKIAogICAgIC8qIFNldCBkb3VibGUgY2xpY2sgdGltZSAqLwotICAgIFNldERvdWJsZUNsaWNrVGltZSggR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiRG91YmxlQ2xpY2tTcGVlZCIsIDQ1MiApICk7CisgICAgU2V0RG91YmxlQ2xpY2tUaW1lKCBHZXRQcm9maWxlSW50MzJBKCJ3aW5kb3dzIiwiRG91YmxlQ2xpY2tTcGVlZCIsNDUyKSApOwogCiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvbW9kdWxlLmMgYi9sb2FkZXIvbW9kdWxlLmMKaW5kZXggNTcwNzAwMy4uMzg2NjEzNyAxMDA2NDQKLS0tIGEvbG9hZGVyL21vZHVsZS5jCisrKyBiL2xvYWRlci9tb2R1bGUuYwpAQCAtMTI5MCw2ICsxMjkwLDcgQEAKIHsKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRDdXJyZW50VGFzaygpOwogICAgIGhNb2R1bGUgPSBHZXRFeGVQdHIoIGhNb2R1bGUgKTsgIC8qIEluIGNhc2Ugd2Ugd2VyZSBwYXNzZWQgYW4gaEluc3RhbmNlICovCiAgICAgaWYgKCEocE1vZHVsZSA9IE1PRFVMRV9HZXRQdHIoIGhNb2R1bGUgKSkpIHJldHVybiAwOwogICAgIGxzdHJjcHluMzJBKCBscEZpbGVOYW1lLCBORV9NT0RVTEVfTkFNRShwTW9kdWxlKSwgblNpemUgKTsKQEAgLTE0MDcsNyArMTQwOCw4IEBACiAJewogCSAgICAvKiBDaGVjayB0aGF0IHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgZGlkIG5vdCBoYXZlIGEgc3VmZml4ICovCiAJICAgIHAgPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOwotCSAgICBpZiAoIXAgfHwgKHN0cmNocihwLCAnLycpICYmIHN0cmNocihwLCAnXFwnKSkpCisJICAgIC8qIGlmIHRoZXJlIGlzIGEgJy4nLCBjaGVjayBpZiBlaXRoZXIgXCBPUiAvIGZvbGxvdyAqLworCSAgICBpZiAoIXAgfHwgc3RyY2hyKHAsICcvJykgfHwgc3RyY2hyKHAsICdcXCcpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHAgPSBmaWxlbmFtZSArIHN0cmxlbihmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgc3RyY3B5KCBwLCAiLmV4ZSIgKTsKZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCA4NDc0MjIzLi5kOTIzOGUzIDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC0xMjQsMTQgKzEyNCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlTSUdOQUxfU2V0SGFuZGxlcgogICovCi1zdGF0aWMgdm9pZCBTSUdOQUxfU2V0SGFuZGxlciggaW50IHNpZywgdm9pZCAoKmZ1bmMpKCkgKQorc3RhdGljIHZvaWQgU0lHTkFMX1NldEhhbmRsZXIoIGludCBzaWcsIHZvaWQgKCpmdW5jKSgpLCBpbnQgZmxhZ3MgKQogewogICAgIGludCByZXQ7CiAgICAgc3RydWN0IHNpZ2FjdGlvbiBzaWdfYWN0OwogCiAjaWZkZWYgbGludXgKICAgICBzaWdfYWN0LnNhX2hhbmRsZXIgPSBmdW5jOwotICAgIHNpZ19hY3Quc2FfZmxhZ3MgPSBTQV9SRVNUQVJUIHwgU0FfTk9NQVNLOworICAgIHNpZ19hY3Quc2FfZmxhZ3MgPSBTQV9SRVNUQVJUIHwgKGZsYWdzKSA/IFNBX05PTUFTSyA6IDA7CiAgICAgLyogUG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG1pbnVzIDQganVzdCBpbiBjYXNlLCBhbmQgbWFrZQogICAgICAgIGl0IGFsaWduZWQgICovCiAgICAgc2lnX2FjdC5zYV9yZXN0b3JlciA9IApAQCAtMTY1LDYgKzE2NSw3IEBACiB9CiAKIGV4dGVybiB2b2lkIHN0b3Bfd2FpdChpbnQgYSk7CitleHRlcm4gdm9pZCBXSU5TT0NLX3NpZ2lvKGludCBhKTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjA0LDE4ICsyMDUsMTkgQEAKICAgICB9CiAjZW5kaWYgIC8qIF9fc3ZyNF9fIHx8IF9TQ09fRFMgKi8KICAgICAKLSAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQUxSTSwgKHZvaWQgKCopKCkpd2luZV90aW1lciApOwotICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdTRUdWLCAodm9pZCAoKikoKSlTSUdOQUxfZmF1bHQgKTsKLSAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHSUxMLCAgKHZvaWQgKCopKCkpU0lHTkFMX2ZhdWx0ICk7Ci0gICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0ZQRSwgICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCApOwotICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdUUkFQLCAodm9pZCAoKikoKSlTSUdOQUxfdHJhcCApOyAvKiBkZWJ1Z2dlciAqLwotICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdIVVAsICAodm9pZCAoKikoKSlTSUdOQUxfdHJhcCApOyAvKiBmb3JjZWQgYnJlYWsgKi8KKyAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQUxSTSwgKHZvaWQgKCopKCkpd2luZV90aW1lciwgMSk7CisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1NFR1YsICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7CisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0lMTCwgICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7CisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0ZQRSwgICh2b2lkICgqKSgpKVNJR05BTF9mYXVsdCwgMSk7CisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR1RSQVAsICh2b2lkICgqKSgpKVNJR05BTF90cmFwLCAxKTsgCS8qIGRlYnVnZ2VyICovCisgICAgU0lHTkFMX1NldEhhbmRsZXIoIFNJR0hVUCwgICh2b2lkICgqKSgpKVNJR05BTF90cmFwLCAxKTsgCS8qIGZvcmNlZCBicmVhayAqLwogI2lmZGVmIFNJR0JVUwotICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdCVVMsICAodm9pZCAoKikoKSlTSUdOQUxfZmF1bHQgKTsKKyAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHQlVTLCAgKHZvaWQgKCopKCkpU0lHTkFMX2ZhdWx0LCAxKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19JUEMKLSAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHVVNSMiwgKHZvaWQgKCopKCkpc3RvcF93YWl0ICk7IC8qIEZvciBJUEMgKi8KKyAgICBTSUdOQUxfU2V0SGFuZGxlciggU0lHVVNSMiwgKHZvaWQgKCopKCkpc3RvcF93YWl0LCAxKTsgCS8qIEZvciBJUEMgKi8KICNlbmRpZgorICAgIFNJR05BTF9TZXRIYW5kbGVyKCBTSUdJTywgICAodm9pZCAoKikoKSlXSU5TT0NLX3NpZ2lvLCAwKTsgCiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTIzOSw0ICsyNDEsMTkgQEAKICAgICBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZ2dF90aW1lciwgTlVMTCk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cworICovCit2b2lkIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEJPT0wzMiBmbGFnICkKK3sKKyAgc2lnc2V0X3QgCXNldDsKKyAgc2lnZW1wdHlzZXQoJnNldCk7CisgIHNpZ2FkZHNldCgmc2V0LCBTSUdJTyk7CisgIHNpZ2FkZHNldCgmc2V0LCBTSUdVU1IxKTsKKyNpZmRlZiBDT05GSUdfSVBDCisgIHNpZ2FkZHNldCgmc2V0LCBTSUdVU1IyKTsKKyNlbmRpZgorICBzaWdwcm9jbWFzayggKGZsYWcpID8gU0lHX0JMT0NLIDogU0lHX1VOQkxPQ0sgLCAmc2V0LCBOVUxMKTsKK30KKwogI2VuZGlmIC8qIGlmbmRlZiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9sb2FkZXIvdGFzay5jIGIvbG9hZGVyL3Rhc2suYwppbmRleCA5N2IyYWMzLi5kNTVlMjUyIDEwMDY0NAotLS0gYS9sb2FkZXIvdGFzay5jCisrKyBiL2xvYWRlci90YXNrLmMKQEAgLTY3LDYgKzY3LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgSEdMT0JBTDE2IFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQodm9pZCk7CitzdGF0aWMgdm9pZAkgVEFTS19ZaWVsZFRvU3lzdGVtKFREQiopOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUQVNLX0luaXQKQEAgLTUxNCw3ICs1MTUsNyBAQAogCiAgICAgICAvKiBHZXQgdGhlIGNvbXBhdGliaWxpdHkgZmxhZ3MgKi8KIAotICAgIHBUYXNrLT5jb21wYXRfZmxhZ3MgPSBHZXRQcm9maWxlSW50KCAiQ29tcGF0aWJpbGl0eSIsIG5hbWUsIDAgKTsKKyAgICBwVGFzay0+Y29tcGF0X2ZsYWdzID0gR2V0UHJvZmlsZUludDMyQSggIkNvbXBhdGliaWxpdHkiLCBuYW1lLCAwICk7CiAKICAgICAgIC8qIEFsbG9jYXRlIGEgY29kZSBzZWdtZW50IGFsaWFzIGZvciB0aGUgVERCICovCiAKQEAgLTY4NSwxMSArNjg2LDIyIEBACiAKICAgICAvKiBSZW1vdmUgdGhlIHRhc2sgZnJvbSB0aGUgbGlzdCB0byBiZSBzdXJlIHdlIG5ldmVyIHN3aXRjaCBiYWNrIHRvIGl0ICovCiAgICAgVEFTS19VbmxpbmtUYXNrKCBoQ3VycmVudFRhc2sgKTsKLSAgICAKKyAgICBpZiggblRhc2tDb3VudCApCisgICAgeworICAgICAgICBUREIqIHAgPSAoVERCICopR2xvYmFsTG9jazE2KCBoRmlyc3RUYXNrICk7CisgICAgICAgIHdoaWxlKCBwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHAtPmhZaWVsZFRvID09IGhDdXJyZW50VGFzayApIHAtPmhZaWVsZFRvID0gMDsKKyAgICAgICAgICAgIHAgPSAoVERCICopR2xvYmFsTG9jazE2KCBwLT5oTmV4dCApOworICAgICAgICB9CisgICAgfQorCiAgICAgaFRhc2tUb0tpbGwgPSBoQ3VycmVudFRhc2s7CiAgICAgaExvY2tlZFRhc2sgPSAwOwogCi0gICAgWWllbGQoKTsKKyAgICBwVGFzay0+bkV2ZW50cyA9IDA7CisgICAgVEFTS19ZaWVsZFRvU3lzdGVtKHBUYXNrKTsKKwogICAgIC8qIFdlIHNob3VsZCBuZXZlciByZXR1cm4gZnJvbSB0aGlzIFlpZWxkKCkgKi8KIAogICAgIGZwcmludGYoc3RkZXJyLCJSZXR1cm4gb2YgdGhlIGxpdmluZyBkZWFkICUwNHghISFcbiIsIGhDdXJyZW50VGFzayk7CkBAIC03NTMsOCArNzY1LDkgQEAKICAgICAgICAgLyogY2hlY2sgZm9yIERpcmVjdGVkWWllbGQoKSAqLwogCiAgICAgICAgIGhUYXNrID0gcE9sZFRhc2stPmhZaWVsZFRvOwotICAgICAgICBpZiAoIShwTmV3VGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIGhUYXNrICkpIHx8ICFwTmV3VGFzay0+bkV2ZW50cykKLSAgICAgICAgICAgIGhUYXNrID0gMDsKKyAgICAgICAgcE5ld1Rhc2sgPSAoVERCICopR2xvYmFsTG9jazE2KCBoVGFzayApOworICAgICAgICBpZiggIXBOZXdUYXNrIHx8ICFwTmV3VGFzay0+bkV2ZW50cykgaFRhc2sgPSAwOworICAgICAgICBwT2xkVGFzay0+aFlpZWxkVG8gPSAwOwogICAgIH0KIAogICAgIC8qIGV4dHJhY3QgaGFyZHdhcmUgZXZlbnRzIG9ubHkhICovCmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmluIGIvbWlzYy9NYWtlZmlsZS5pbgppbmRleCAzMmI1Y2MyLi5lMjFiMTMzIDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlLmluCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTM4LDcgKzM4LDggQEAKIAl1c2VyLmMgXAogCXZlci5jIFwKIAl3MzJzeXMuYyBcCi0Jd2luc29ja2V0LmMgXAorCXdpbnNvY2suYyBcCisJd2luc29ja19hc3luYy5jIFwKIAl3c3ByaW50Zi5jIFwKIAl4bWFsbG9jLmMKIApkaWZmIC0tZ2l0IGEvbWlzYy9jb21tZGxnLmMgYi9taXNjL2NvbW1kbGcuYwppbmRleCA4MGFhODM0Li5mZGRmNWE5IDEwMDY0NAotLS0gYS9taXNjL2NvbW1kbGcuYworKysgYi9taXNjL2NvbW1kbGcuYwpAQCAtMTY2LDIyICsxNjYsMTQgQEAKICAqLwogc3RhdGljIEJPT0wgRklMRURMR19TY2FuRGlyKEhXTkQgaFduZCwgTFBTVFIgbmV3UGF0aCkKIHsKLSAgICBCT09MMzIgcmV0ID0gRkFMU0U7CiAgICAgaW50IGxlbjsKLSAgICBjaGFyICpzdHIgPSBTRUdQVFJfQUxMT0MoNTEyKTsKLSAgICBpZiAoIXN0cikgcmV0dXJuIFRSVUU7CisgICAgY2hhciBzdHJbNTEyXTsKIAogICAgIGxzdHJjcHluMzJBKCBzdHIsIG5ld1BhdGgsIDUxMiApOwogICAgIGxlbiA9IHN0cmxlbihzdHIpOwotICAgIEdldERsZ0l0ZW1UZXh0MzJBKCBoV25kLCBlZHQxLCBzdHIgKyBsZW4sIDUxMiAtIGxlbiApOwotICAgIGlmIChEbGdEaXJMaXN0KGhXbmQsIFNFR1BUUl9HRVQoc3RyKSwgbHN0MSwgMCwgMHgwMDAwKSkKLSAgICB7Ci0gICAgICAgIHN0cmNweSggc3RyLCAiKi4qIiApOwotICAgICAgICBEbGdEaXJMaXN0KGhXbmQsIFNFR1BUUl9HRVQoc3RyKSwgbHN0Miwgc3RjMSwgMHg4MDEwICk7Ci0gICAgICAgIHJldCA9IFRSVUU7Ci0gICAgfQotICAgIFNFR1BUUl9GUkVFKHN0cik7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBHZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgc3RyICsgbGVuLCBzaXplb2Yoc3RyKSAtIGxlbiApOworICAgIGlmICghRGxnRGlyTGlzdDMyQSggaFduZCwgc3RyLCBsc3QxLCAwLCAweDAwMDAgKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiBEbGdEaXJMaXN0MzJBKCBoV25kLCAiKi4qIiwgbHN0Miwgc3RjMSwgMHg4MDEwICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzg4LDEwICszODAsNyBAQAogICAJCQlscG9mbi0+bkZpbHRlckluZGV4LCB0bXBzdHIpOwogICBTZXREbGdJdGVtVGV4dDMyQSggaFduZCwgZWR0MSwgdG1wc3RyICk7CiAgIC8qIGdldCBkcml2ZSBsaXN0ICovCi0gIHBzdHIgPSBTRUdQVFJfQUxMT0MoMSk7Ci0gICpwc3RyID0gMDsKLSAgRGxnRGlyTGlzdENvbWJvQm94MTYoaFduZCwgU0VHUFRSX0dFVChwc3RyKSwgY21iMiwgMCwgMHhDMDAwKTsKLSAgU0VHUFRSX0ZSRUUocHN0cik7CisgIERsZ0Rpckxpc3RDb21ib0JveDMyQShoV25kLCAiIiwgY21iMiwgMCwgMHhDMDAwKTsKICAgLyogcmVhZCBpbml0aWFsIGRpcmVjdG9yeSAqLwogICBpZiAoUFRSX1NFR19UT19MSU4obHBvZm4tPmxwc3RySW5pdGlhbERpcikgIT0gTlVMTCkgCiAgICAgewpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggZTdhOGJlNi4uNjZiMDU0OSAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC02MTYsNiArNjE2LDIyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgY2FsbG9jICAgICAgICAoQ1JURExMLjM1MCkKKyAqLworVk9JRCogQ1JURExMX2NhbGxvYyhEV09SRCBzaXplLCBEV09SRCBjb3VudCkKK3sKKyAgICByZXR1cm4gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBzaXplICogY291bnQgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICByZWFsbG9jICAgICAgICAoQ1JURExMLjQ0NykKKyAqLworVk9JRCogQ1JURExMX3JlYWxsb2MoIFZPSUQgKnB0ciwgRFdPUkQgc2l6ZSApCit7CisgICAgcmV0dXJuIEhlYXBSZUFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwdHIsIHNpemUgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgICAgICBmcmVlICAgICAgICAgIChDUlRETEwuNDI3KQogICovCiBWT0lEIENSVERMTF9mcmVlKExQVk9JRCBwdHIpCmRpZmYgLS1naXQgYS9taXNjL2RyaXZlci5jIGIvbWlzYy9kcml2ZXIuYwppbmRleCBlMDkxMTNiLi5jMGEyM2IwIDEwMDY0NAotLS0gYS9taXNjL2RyaXZlci5jCisrKyBiL21pc2MvZHJpdmVyLmMKQEAgLTIxLDcgKzIxLDcgQEAKICAgICBjaGFyICBzdHJbMjU2XTsKICAgICBMUFNUUiBwdHI7CiAKLSAgICBpZiAoR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoICJkcml2ZXJzIiwgTlVMTCwgIiIsIHN0ciwgc2l6ZW9mKHN0ciksCisgICAgaWYgKEdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCAiZHJpdmVycyIsIE5VTEwsICIiLCBzdHIsIHNpemVvZihzdHIpLAogCQkJCSAiU1lTVEVNLklOSSIgKSA8IDIpCiAgICAgewogICAgIAlmcHJpbnRmKCBzdGRlcnIsCkBAIC04NCw3ICs4NCw3IEBACiAJCSAgICBscERyaXZlck5hbWUsIGxwU2VjdGlvbk5hbWUsIGxQYXJhbSApOwogCiAgICAgaWYgKGxwU2VjdGlvbk5hbWUgPT0gTlVMTCkgbHBTZWN0aW9uTmFtZSA9ICJkcml2ZXJzIjsKLSAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZyggbHBTZWN0aW9uTmFtZSwgbHBEcml2ZXJOYW1lLCAiIiwgRHJ2TmFtZSwKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZzMyQSggbHBTZWN0aW9uTmFtZSwgbHBEcml2ZXJOYW1lLCAiIiwgRHJ2TmFtZSwKIAkJCSAgICAgc2l6ZW9mKERydk5hbWUpLCAiU1lTVEVNLklOSSIgKTsKICAgICBkcHJpbnRmX2RyaXZlciggc3RkZGViLCJPcGVuRHJpdmVyIC8vIERydk5hbWU9JyVzJ1xuIiwgRHJ2TmFtZSApOwogICAgIGlmIChsc3RybGVuMzJBKERydk5hbWUpIDwgMSkgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9taXNjL2tleWJvYXJkLmMgYi9taXNjL2tleWJvYXJkLmMKaW5kZXggNzUwYTY0NS4uY2YwY2JiZSAxMDA2NDQKLS0tIGEvbWlzYy9rZXlib2FyZC5jCisrKyBiL21pc2Mva2V5Ym9hcmQuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJrZXlib2FyZC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX0tFWUJPQVJEICovCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTIyLDEwNSArMjMsMTEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgS2V5VGFibGVFbnRyeSBLZXlUYWJsZVtdID0KIHsKLQl7IDB4MywgMHgzLCAweDAsICIiIH0sCi0JeyAweDgsIDB4OCwgMHhlLCAiQmFja3NwYWNlIiB9LAotCXsgMHg5LCAweDksIDB4ZiwgIlRhYiIgfSwKLQl7IDB4YywgMHgwLCAweDRjLCAiTnVtIDUiIH0sCi0JeyAweGQsIDB4ZCwgMHgxYywgIkVudGVyIiB9LAotCXsgMHgxMCwgMHgwLCAweDJhLCAiU2hpZnQiIH0sCi0JeyAweDExLCAweDAsIDB4MWQsICJDdHJsIiB9LAotCXsgMHgxMiwgMHgwLCAweDM4LCAiQWx0IiB9LAotCXsgMHgxNCwgMHgwLCAweDNhLCAiQ2FwcyBMb2NrIiB9LAotCXsgMHgxYiwgMHgxYiwgMHgxLCAiRXNjIiB9LAotCXsgMHgyMCwgMHgyMCwgMHgzOSwgIlNwYWNlIiB9LAotCXsgMHgyMSwgMHgwLCAweDQ5LCAiTnVtIDkiIH0sCi0JeyAweDIyLCAweDAsIDB4NTEsICJOdW0gMyIgfSwKLQl7IDB4MjMsIDB4MCwgMHg0ZiwgIk51bSAxIiB9LAotCXsgMHgyNCwgMHgwLCAweDQ3LCAiTnVtIDciIH0sCi0JeyAweDI1LCAweDAsIDB4NGIsICJOdW0gNCIgfSwKLQl7IDB4MjYsIDB4MCwgMHg0OCwgIk51bSA4IiB9LAotCXsgMHgyNywgMHgwLCAweDRkLCAiTnVtIDYiIH0sCi0JeyAweDI4LCAweDAsIDB4NTAsICJOdW0gMiIgfSwKLQl7IDB4MmQsIDB4MCwgMHg1MiwgIk51bSAwIiB9LAotCXsgMHgyZSwgMHgwLCAweDUzLCAiTnVtIERlbCIgfSwKLQl7IDB4MzAsIDB4MzAsIDB4YiwgIjAiIH0sCi0JeyAweDMxLCAweDMxLCAweDIsICIxIiB9LAotCXsgMHgzMiwgMHgzMiwgMHgzLCAiMiIgfSwKLQl7IDB4MzMsIDB4MzMsIDB4NCwgIjMiIH0sCi0JeyAweDM0LCAweDM0LCAweDUsICI0IiB9LAotCXsgMHgzNSwgMHgzNSwgMHg2LCAiNSIgfSwKLQl7IDB4MzYsIDB4MzYsIDB4NywgIjYiIH0sCi0JeyAweDM3LCAweDM3LCAweDgsICI3IiB9LAotCXsgMHgzOCwgMHgzOCwgMHg5LCAiOCIgfSwKLQl7IDB4MzksIDB4MzksIDB4YSwgIjkiIH0sCi0JeyAweDQxLCAweDQxLCAweDFlLCAiQSIgfSwKLQl7IDB4NDIsIDB4NDIsIDB4MzAsICJCIiB9LAotCXsgMHg0MywgMHg0MywgMHgyZSwgIkMiIH0sCi0JeyAweDQ0LCAweDQ0LCAweDIwLCAiRCIgfSwKLQl7IDB4NDUsIDB4NDUsIDB4MTIsICJFIiB9LAotCXsgMHg0NiwgMHg0NiwgMHgyMSwgIkYiIH0sCi0JeyAweDQ3LCAweDQ3LCAweDIyLCAiRyIgfSwKLQl7IDB4NDgsIDB4NDgsIDB4MjMsICJIIiB9LAotCXsgMHg0OSwgMHg0OSwgMHgxNywgIkkiIH0sCi0JeyAweDRhLCAweDRhLCAweDI0LCAiSiIgfSwKLQl7IDB4NGIsIDB4NGIsIDB4MjUsICJLIiB9LAotCXsgMHg0YywgMHg0YywgMHgyNiwgIkwiIH0sCi0JeyAweDRkLCAweDRkLCAweDMyLCAiTSIgfSwKLQl7IDB4NGUsIDB4NGUsIDB4MzEsICJOIiB9LAotCXsgMHg0ZiwgMHg0ZiwgMHgxOCwgIk8iIH0sCi0JeyAweDUwLCAweDUwLCAweDE5LCAiUCIgfSwKLQl7IDB4NTEsIDB4NTEsIDB4MTAsICJRIiB9LAotCXsgMHg1MiwgMHg1MiwgMHgxMywgIlIiIH0sCi0JeyAweDUzLCAweDUzLCAweDFmLCAiUyIgfSwKLQl7IDB4NTQsIDB4NTQsIDB4MTQsICJUIiB9LAotCXsgMHg1NSwgMHg1NSwgMHgxNiwgIlUiIH0sCi0JeyAweDU2LCAweDU2LCAweDJmLCAiViIgfSwKLQl7IDB4NTcsIDB4NTcsIDB4MTEsICJXIiB9LAotCXsgMHg1OCwgMHg1OCwgMHgyZCwgIlgiIH0sCi0JeyAweDU5LCAweDU5LCAweDE1LCAiWSIgfSwKLQl7IDB4NWEsIDB4NWEsIDB4MmMsICJaIiB9LAotCXsgMHg2MCwgMHgwLCAweDUyLCAiTnVtIDAiIH0sCi0JeyAweDYxLCAweDAsIDB4NGYsICJOdW0gMSIgfSwKLQl7IDB4NjIsIDB4MCwgMHg1MCwgIk51bSAyIiB9LAotCXsgMHg2MywgMHgwLCAweDUxLCAiTnVtIDMiIH0sCi0JeyAweDY0LCAweDAsIDB4NGIsICJOdW0gNCIgfSwKLQl7IDB4NjUsIDB4MCwgMHg0YywgIk51bSA1IiB9LAotCXsgMHg2NiwgMHgwLCAweDRkLCAiTnVtIDYiIH0sCi0JeyAweDY3LCAweDAsIDB4NDcsICJOdW0gNyIgfSwKLQl7IDB4NjgsIDB4MCwgMHg0OCwgIk51bSA4IiB9LAotCXsgMHg2OSwgMHgwLCAweDQ5LCAiTnVtIDkiIH0sCi0JeyAweDZhLCAweDJhLCAweDM3LCAiTnVtICoiIH0sCi0JeyAweDZiLCAweDJiLCAweDRlLCAiTnVtICsiIH0sCi0JeyAweDZjLCAweDAsIDB4MCwgIiIgfSwKLQl7IDB4NmQsIDB4MmQsIDB4NGEsICJOdW0gLSIgfSwKLQl7IDB4NmUsIDB4MmUsIDB4NTMsICJOdW0gRGVsIiB9LAotCXsgMHg2ZiwgMHgyZiwgMHgwLCAiIiB9LAotCXsgMHg3MCwgMHgwLCAweDNiLCAiRjEiIH0sCi0JeyAweDcxLCAweDAsIDB4M2MsICJGMiIgfSwKLQl7IDB4NzIsIDB4MCwgMHgzZCwgIkYzIiB9LAotCXsgMHg3MywgMHgwLCAweDNlLCAiRjQiIH0sCi0JeyAweDc0LCAweDAsIDB4M2YsICJGNSIgfSwKLQl7IDB4NzUsIDB4MCwgMHg0MCwgIkY2IiB9LAotCXsgMHg3NiwgMHgwLCAweDQxLCAiRjciIH0sCi0JeyAweDc3LCAweDAsIDB4NDIsICJGOCIgfSwKLQl7IDB4NzgsIDB4MCwgMHg0MywgIkY5IiB9LAotCXsgMHg3OSwgMHgwLCAweDQ0LCAiRjEwIiB9LAotCXsgMHg3YSwgMHgwLCAweDU3LCAiRjExIiB9LAotCXsgMHg3YiwgMHgwLCAweDU4LCAiRjEyIiB9LAotCXsgMHg5MCwgMHgwLCAweDQ1LCAiUGF1c2UiIH0sCi0JeyAweDkxLCAweDAsIDB4NDYsICJTY3JvbGwgTG9jayIgfSwKLQl7IDB4YmEsIDB4M2IsIDB4MjcsICI7IiB9LAotCXsgMHhiYiwgMHgzZCwgMHhkLCAiPSIgfSwKLQl7IDB4YmMsIDB4MmMsIDB4MzMsICIsIiB9LAotCXsgMHhiZCwgMHgyZCwgMHhjLCAiLSIgfSwKLQl7IDB4YmUsIDB4MmUsIDB4MzQsICIuIiB9LAotCXsgMHhiZiwgMHgyZiwgMHgzNSwgIi8iIH0sCi0JeyAweGMwLCAweDYwLCAweDI5LCAiYCIgfSwKLQl7IDB4ZGIsIDB4NWIsIDB4MWEsICJbIiB9LAotCXsgMHhkYywgMHg1YywgMHgyYiwgIlxcIiB9LAotCXsgMHhkZCwgMHg1ZCwgMHgxYiwgIl0iIH0sCi0JeyAweGRlLCAweDI3LCAweDI4LCAiXCciIH0sCi0JeyAweGUyLCAweDVjLCAweDU2LCAiXFwiIH0sCisJeyBWS19DQU5DRUwsCTB4MywJMCwJIiIgfSwKKwl7IFZLX0JBQ0ssCTB4OCwJMHhlLAkiQmFja3NwYWNlIiB9LAorCXsgVktfVEFCLAkweDksCTB4ZiwJIlRhYiIgfSwKKwl7IFZLX0NMRUFSLAkwLAkweDRjLAkiQ2xlYXIiIH0sCisJeyBWS19SRVRVUk4sCTB4ZCwJMHgxYywJIkVudGVyIiB9LAorCXsgVktfU0hJRlQsCTAsCTB4MmEsCSJTaGlmdCIgfSwKKwl7IFZLX0NPTlRST0wsCTAsCTB4MWQsCSJDdHJsIiB9LAorCXsgVktfTUVOVSwJMCwJMHgzOCwJIkFsdCIgfSwKKwl7IFZLX0NBUElUQUwsCTAsCTB4M2EsCSJDYXBzIExvY2siIH0sCisJeyBWS19FU0NBUEUsCTB4MWIsCTB4MSwJIkVzYyIgfSwKKwl7IFZLX1NQQUNFLAkweDIwLAkweDM5LAkiU3BhY2UiIH0sCisJeyBWS19QUklPUiwJMCwJMHg0OSwJIlBhZ2UgVXAiIH0sCisJeyBWS19ORVhULAkwLAkweDUxLAkiUGFnZSBEb3duIiB9LAorCXsgVktfRU5ELAkwLAkweDRmLAkiRW5kIiB9LAorCXsgVktfSE9NRSwJMCwJMHg0NywJIkhvbWUiIH0sCisJeyBWS19MRUZULAkwLAkweDRiLAkiTGVmdCBBcnJvdyIgfSwKKwl7IFZLX1VQLAkwLAkweDQ4LAkiVXAgQXJyb3ciIH0sCisJeyBWS19SSUdIVCwJMCwJMHg0ZCwJIlJpZ2h0IEFycm93IiB9LAorCXsgVktfRE9XTiwJMCwJMHg1MCwJIkRvd24gQXJyb3ciIH0sCisJeyBWS19JTlNFUlQsCTAsCTB4NTIsCSJJbnMiIH0sCisJeyBWS19ERUxFVEUsCTAsCTB4NTMsCSJEZWwiIH0sCisJeyBWS18wLAkJMHgzMCwJMHhiLAkiMCIgfSwKKwl7IFZLXzEsCQkweDMxLAkweDIsCSIxIiB9LAorCXsgVktfMiwJCTB4MzIsCTB4MywJIjIiIH0sCisJeyBWS18zLAkJMHgzMywJMHg0LAkiMyIgfSwKKwl7IFZLXzQsCQkweDM0LAkweDUsCSI0IiB9LAorCXsgVktfNSwJCTB4MzUsCTB4NiwJIjUiIH0sCisJeyBWS182LAkJMHgzNiwJMHg3LAkiNiIgfSwKKwl7IFZLXzcsCQkweDM3LAkweDgsCSI3IiB9LAorCXsgVktfOCwJCTB4MzgsCTB4OSwJIjgiIH0sCisJeyBWS185LAkJMHgzOSwJMHhhLAkiOSIgfSwKKwl7IFZLX0EsCQkweDQxLAkweDFlLAkiQSIgfSwKKwl7IFZLX0IsCQkweDQyLAkweDMwLAkiQiIgfSwKKwl7IFZLX0MsCQkweDQzLAkweDJlLAkiQyIgfSwKKwl7IFZLX0QsCQkweDQ0LAkweDIwLAkiRCIgfSwKKwl7IFZLX0UsCQkweDQ1LAkweDEyLAkiRSIgfSwKKwl7IFZLX0YsCQkweDQ2LAkweDIxLAkiRiIgfSwKKwl7IFZLX0csCQkweDQ3LAkweDIyLAkiRyIgfSwKKwl7IFZLX0gsCQkweDQ4LAkweDIzLAkiSCIgfSwKKwl7IFZLX0ksCQkweDQ5LAkweDE3LAkiSSIgfSwKKwl7IFZLX0osCQkweDRhLAkweDI0LAkiSiIgfSwKKwl7IFZLX0ssCQkweDRiLAkweDI1LAkiSyIgfSwKKwl7IFZLX0wsCQkweDRjLAkweDI2LAkiTCIgfSwKKwl7IFZLX00sCQkweDRkLAkweDMyLAkiTSIgfSwKKwl7IFZLX04sCQkweDRlLAkweDMxLAkiTiIgfSwKKwl7IFZLX08sCQkweDRmLAkweDE4LAkiTyIgfSwKKwl7IFZLX1AsCQkweDUwLAkweDE5LAkiUCIgfSwKKwl7IFZLX1EsCQkweDUxLAkweDEwLAkiUSIgfSwKKwl7IFZLX1IsCQkweDUyLAkweDEzLAkiUiIgfSwKKwl7IFZLX1MsCQkweDUzLAkweDFmLAkiUyIgfSwKKwl7IFZLX1QsCQkweDU0LAkweDE0LAkiVCIgfSwKKwl7IFZLX1UsCQkweDU1LAkweDE2LAkiVSIgfSwKKwl7IFZLX1YsCQkweDU2LAkweDJmLAkiViIgfSwKKwl7IFZLX1csCQkweDU3LAkweDExLAkiVyIgfSwKKwl7IFZLX1gsCQkweDU4LAkweDJkLAkiWCIgfSwKKwl7IFZLX1ksCQkweDU5LAkweDE1LAkiWSIgfSwKKwl7IFZLX1osCQkweDVhLAkweDJjLAkiWiIgfSwKKwl7IFZLX05VTVBBRDAsCTAsCTB4NTIsCSJOdW0gMCIgfSwKKwl7IFZLX05VTVBBRDEsCTAsCTB4NGYsCSJOdW0gMSIgfSwKKwl7IFZLX05VTVBBRDIsCTAsCTB4NTAsCSJOdW0gMiIgfSwKKwl7IFZLX05VTVBBRDMsCTAsCTB4NTEsCSJOdW0gMyIgfSwKKwl7IFZLX05VTVBBRDQsCTAsCTB4NGIsCSJOdW0gNCIgfSwKKwl7IFZLX05VTVBBRDUsCTAsCTB4NGMsCSJOdW0gNSIgfSwKKwl7IFZLX05VTVBBRDYsCTAsCTB4NGQsCSJOdW0gNiIgfSwKKwl7IFZLX05VTVBBRDcsCTAsCTB4NDcsCSJOdW0gNyIgfSwKKwl7IFZLX05VTVBBRDgsCTAsCTB4NDgsCSJOdW0gOCIgfSwKKwl7IFZLX05VTVBBRDksCTAsCTB4NDksCSJOdW0gOSIgfSwKKwl7IFZLX01VTFRJUExZLAkweDJhLAkweDM3LAkiTnVtICoiIH0sCisJeyBWS19BREQsCTB4MmIsCTB4NGUsCSJOdW0gKyIgfSwKKwl7IFZLX1NFUEFSQVRPUiwJMCwJMCwJIiIgfSwKKwl7IFZLX1NVQlRSQUNULAkweDJkLAkweDRhLAkiTnVtIC0iIH0sCisJeyBWS19ERUNJTUFMLAkweDJlLAkweDUzLAkiTnVtIERlbCIgfSwKKwl7IFZLX0RJVklERSwJMHgyZiwJMCwJIk51bSAvIiB9LAorCXsgVktfRjEsCTAsCTB4M2IsCSJGMSIgfSwKKwl7IFZLX0YyLAkwLAkweDNjLAkiRjIiIH0sCisJeyBWS19GMywJMCwJMHgzZCwJIkYzIiB9LAorCXsgVktfRjQsCTAsCTB4M2UsCSJGNCIgfSwKKwl7IFZLX0Y1LAkwLAkweDNmLAkiRjUiIH0sCisJeyBWS19GNiwJMCwJMHg0MCwJIkY2IiB9LAorCXsgVktfRjcsCTAsCTB4NDEsCSJGNyIgfSwKKwl7IFZLX0Y4LAkwLAkweDQyLAkiRjgiIH0sCisJeyBWS19GOSwJMCwJMHg0MywJIkY5IiB9LAorCXsgVktfRjEwLAkwLAkweDQ0LAkiRjEwIiB9LAorCXsgVktfRjExLAkwLAkweDU3LAkiRjExIiB9LAorCXsgVktfRjEyLAkwLAkweDU4LAkiRjEyIiB9LAorCXsgVktfTlVNTE9DSywJMCwJMHg0NSwJIk51bSBMb2NrIiB9LAorCXsgVktfU0NST0xMLAkwLAkweDQ2LAkiU2Nyb2xsIExvY2siIH0sCisJLyogQWxsb3dhYmxlIHJhbmdlcyBmb3IgT0VNLXNwZWNpZmljIHZpcnR1YWwta2V5IGNvZGVzICovCisvKgktCQkgICAgMHhCQS0weEMwCQlPRU0gc3BlY2lmaWMgKi8KKwl7IDB4YmEsCQkweDNiLAkweDI3LAkiOyIgfSwKKwl7IDB4YmIsCQkweDNkLAkweGQsCSI9IiB9LAorCXsgMHhiYywJCTB4MmMsCTB4MzMsCSIsIiB9LAorCXsgMHhiZCwJCTB4MmQsCTB4YywJIi0iIH0sCisJeyAweGJlLAkJMHgyZSwJMHgzNCwJIi4iIH0sCisJeyAweGJmLAkJMHgyZiwJMHgzNSwJIi8iIH0sCisJeyAweGMwLAkJMHg2MCwJMHgyOSwJImAiIH0sCisvKgktCQkgICAgMHhEQi0weEU0CQlPRU0gc3BlY2lmaWMgKi8KKwl7IDB4ZGIsCQkweDViLAkweDFhLAkiWyIgfSwKKwl7IDB4ZGMsCQkweDVjLAkweDJiLAkiXFwiIH0sCisJeyAweGRkLAkJMHg1ZCwJMHgxYiwJIl0iIH0sCisJeyAweGRlLAkJMHgyNywJMHgyOCwJIiciIH0sCisJeyAweGUyLAkJMHg1YywJMHg1NiwJIlxcIiB9LAorLyoJLQkJICAgIDB4RTYJCU9FTSBzcGVjaWZpYyAqLworLyoJLQkJICAgIDB4RTktMHhGNQkJT0VNIHNwZWNpZmljICovCiB9OwogCiAjZGVmaW5lIEtleVRhYmxlU2l6ZQlzaXplb2YoS2V5VGFibGUpIC8gc2l6ZW9mKHN0cnVjdCBLZXlUYWJsZUVudHJ5KQpAQCAtMTI4LDM0ICsxMzQsNTUgQEAKIGludCBUb0FzY2lpKFdPUkQgd1ZpcnRLZXksIFdPUkQgd1NjYW5Db2RlLCBMUFNUUiBscEtleVN0YXRlLCAKIAlMUFZPSUQgbHBDaGFyLCBXT1JEIHdGbGFncykgCiB7CisJY2hhciBzaGlmdCA9IGxwS2V5U3RhdGVbVktfU0hJRlRdIDwgMDsKIAlpbnQgaTsKIAotICAgIAlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiVG9Bc2NpaSAoJWQsJWQpXG4iLHdWaXJ0S2V5LCB3U2NhbkNvZGUpOworICAgIAlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwgIlRvQXNjaWkgKCV4LCV4KSAtPiAiLCB3VmlydEtleSwgd1NjYW5Db2RlKTsKIAogCS8qIEZJWE1FOiBjb2RlcGFnZSBpcyBicm9rZW4gKi8KIAotCWZvciAoaSA9IDAgOyBpICE9IEtleVRhYmxlU2l6ZSA7IGkrKykgCi0JCWlmIChLZXlUYWJsZVtpXS52aXJ0dWFsa2V5ID09IHdWaXJ0S2V5KSAgCi0JCSB7Ci0JCSAgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJcdFx0Y2hhciA9ICVzXG4iLCBLZXlUYWJsZVtpXS5uYW1lKTsKLQkJICAgaWYoIGlzcHJpbnQoS2V5VGFibGVbaV0uQVNDSUkpIHx8IGlzc3BhY2UoS2V5VGFibGVbaV0uQVNDSUkpICkKLQkJICAgICB7Ci0JCQkqKEJZVEUqKWxwQ2hhciA9IEtleVRhYmxlW2ldLkFTQ0lJOwotCQkJKigoKEJZVEUqKWxwQ2hhcikgKyAxKSA9IDA7Ci0KLQkJCWlmKCBpc2FscGhhKCAqKEJZVEUqKWxwQ2hhciApICkKLQkJCSAgaWYoIChscEtleVN0YXRlW1ZLX0NBUElUQUxdPDAgJiYgIWxwS2V5U3RhdGVbVktfU0hJRlRdKSB8fAotCQkJICAgICAgKCFscEtleVN0YXRlW1ZLX0NBUElUQUxdICYmIGxwS2V5U3RhdGVbVktfU0hJRlRdPDApICkKLQkJCSAgICAgICooQllURSopbHBDaGFyID0gdG91cHBlciggKihCWVRFKilscENoYXIgKTsKLQkJCSAgZWxzZQotCQkJICAgICAgKihCWVRFKilscENoYXIgPSB0b2xvd2VyKCAqKEJZVEUqKWxwQ2hhciApOwotCi0JCQlyZXR1cm4gMTsKLQkJICAgICB9Ci0JCSB9Ci0KIAkqKEJZVEUqKWxwQ2hhciA9IDA7Ci0JcmV0dXJuIDA7CisJc3dpdGNoICh3VmlydEtleSkKKwkgIHsKKyNkZWZpbmUgdmtjYXNlMihrMSxrMix2YWwpIGNhc2UgdmFsIDogKihCWVRFKilscENoYXIgPSBzaGlmdCA/IGsyIDogazE7IGJyZWFrOworI2RlZmluZSB2a2Nhc2UoaywgdmFsKSB2a2Nhc2UyKHZhbCwgaywgdmFsKQorCSAgV0lORV9WS0VZX01BUFBJTkdTCisjdW5kZWYgdmtjYXNlCisjdW5kZWYgdmtjYXNlMgorCSAgZGVmYXVsdCA6CisJICAgIGZvciAoaSA9IDAgOyA7IGkrKykgCisJICAgICAgeworCSAgICAgIGlmIChpID09IEtleVRhYmxlU2l6ZSkKKwkJeworCQkgIGRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCAiMFxuIik7CisJCSAgcmV0dXJuIDA7CisJCX0KKwkgICAgICBpZiAoS2V5VGFibGVbaV0udmlydHVhbGtleSA9PSB3VmlydEtleSkgIAorCSAgICAgICAgeworCQkgIGlmICghaXNwcmludChLZXlUYWJsZVtpXS5BU0NJSSkgJiYgIWlzc3BhY2UoS2V5VGFibGVbaV0uQVNDSUkpKQorCQkgICAgeworCQkgICAgICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwgIjBcbiIpOworCQkgICAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJICBkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwiXCIlc1wiICIsIEtleVRhYmxlW2ldLm5hbWUpOworCisJCSAgKihCWVRFKilscENoYXIgPSBLZXlUYWJsZVtpXS5BU0NJSTsKKwkJICAqKCgoQllURSopbHBDaGFyKSArIDEpID0gMDsKKworCQkgIGlmIChpc2FscGhhKCooQllURSopbHBDaGFyKSkKKwkJICAgIGlmKCAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXTwwICYmICFscEtleVN0YXRlW1ZLX1NISUZUXSkgfHwKKwkJCSghbHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmJiBscEtleVN0YXRlW1ZLX1NISUZUXTwwKSApCisJCQkqKEJZVEUqKWxwQ2hhciA9IHRvdXBwZXIoICooQllURSopbHBDaGFyICk7CisJCSAgICBlbHNlCisJCQkqKEJZVEUqKWxwQ2hhciA9IHRvbG93ZXIoICooQllURSopbHBDaGFyICk7CisJCSAgYnJlYWs7CisJICAgICAgICB9CisJICAgICB9CisJICB9CisJaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gPCAwKQorCSAgKihCWVRFKilscENoYXIgPSAqKEJZVEUqKWxwQ2hhciAmIDB4MWY7CisJZHByaW50Zl9rZXlib2FyZChzdGRkZWIsICIxICgleClcbiIsICooQllURSopbHBDaGFyKTsKKwlyZXR1cm4gMTsKIH0KIAogRFdPUkQgT2VtS2V5U2NhbihXT1JEIHdPZW1DaGFyKQpAQCAtMTY2LDcgKzE5MywxNiBAQAogfQogCiAvKiBWa0tleVNjYW4gdHJhbnNsYXRlcyBhbiBBTlNJIGNoYXJhY3RlciB0byBhIHZpcnR1YWwta2V5IGFuZCBzaGlmdCBjb2RlCi0gKiBmb3IgdGhlIGN1cnJlbnQga2V5Ym9hcmQuICovCisgKiBmb3IgdGhlIGN1cnJlbnQga2V5Ym9hcmQuCisgKiBGSVhNRSBoaWdoLW9yZGVyIGJ5dGUgc2hvdWxkIHlpZWxkIDoKKyAqCTAJVW5zaGlmdGVkCisgKgkxCVNoaWZ0CisgKgkyCUN0cmwKKyAqCTMtNQlTaGlmdC1rZXkgY29tYmluYXRpb25zIHRoYXQgYXJlIG5vdCB1c2VkIGZvciBjaGFyYWN0ZXJzCisgKgk2CUN0cmwtQWx0CisgKgk3CUN0cmwtQWx0LVNoaWZ0CisgKglJLmUuIDoJU2hpZnQgPSAxLCBDdHJsID0gMiwgQWx0ID0gNC4KKyAqLwogCiBXT1JEIFZrS2V5U2NhbihXT1JEIGNDaGFyKQogewpAQCAtMjA4LDI2ICsyNDQsMjggQEAKIAlpbnQgaTsKIAkKIAlzd2l0Y2god01hcFR5cGUpIHsKLQkJY2FzZSAwOgorCQljYXNlIDA6CS8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KIAkJCWZvciAoaSA9IDAgOyBpICE9IEtleVRhYmxlU2l6ZSA7IGkrKykgCiAJCQkJaWYgKEtleVRhYmxlW2ldLnZpcnR1YWxrZXkgPT0gd0NvZGUpIAogCQkJCQlyZXR1cm4gS2V5VGFibGVbaV0uc2NhbmNvZGU7CiAJCQlyZXR1cm4gMDsKIAotCQljYXNlIDE6CisJCWNhc2UgMTogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwogCQkJZm9yIChpID0gMCA7IGkgIT0gS2V5VGFibGVTaXplIDsgaSsrKSAKIAkJCQlpZiAoS2V5VGFibGVbaV0uc2NhbmNvZGUgPT0gd0NvZGUpIAogCQkJCQlyZXR1cm4gS2V5VGFibGVbaV0udmlydHVhbGtleTsKIAkJCXJldHVybiAwOwogCi0JCWNhc2UgMjoKKwkJY2FzZSAyOiAvKiB2a2V5LWNvZGUgdG8gdW5zaGlmdGVkIEFOU0kgY29kZSAqLworCQkJLyogRklYTUUgOiB3aGF0IGRvZXMgdW5zaGlmdGVkIG1lYW4gPyAnYScgb3IgJ0EnID8gKi8KIAkJCWZvciAoaSA9IDAgOyBpICE9IEtleVRhYmxlU2l6ZSA7IGkrKykgCiAJCQkJaWYgKEtleVRhYmxlW2ldLnZpcnR1YWxrZXkgPT0gd0NvZGUpIAogCQkJCQlyZXR1cm4gS2V5VGFibGVbaV0uQVNDSUk7CiAJCQlyZXR1cm4gMDsKIAotCQlkZWZhdWx0OiAKLQkJCWZwcmludGYoc3RkZXJyLCAiTWFwVmlydHVhbEtleTogdW5rbm93biB3TWFwVHlwZSFcbiIpOworCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLworCQkJZnByaW50ZihzdGRlcnIsICJNYXBWaXJ0dWFsS2V5OiB1bmtub3duIHdNYXBUeXBlICVkICFcbiIsCisJCQkJd01hcFR5cGUpOwogCQkJcmV0dXJuIDA7CQogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggYjkxMTNhNy4uZjg1OTdlYyAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTgwNCw3ICs4MDQsOCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBtb2RlIHNldD8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuLiBDaGVjayBHZXRXaW5GbGFncygpIVxuIik7CiAgICAgYnJlYWs7CiAgIH0KLQorICBpZiggZ2V0VmVyc2lvbkV4LmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQgKQorICAgICAgcmVzdWx0IHw9IDB4NDAwMDsgLyogdW5kb2N1bWVudGVkIFdGX1dJTk5UICovCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTEwNzYsMTggKzEwNzcsMjEgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgU1BJX0dFVEZBU1RUQVNLU1dJVENIOgotCQkJKihCT09MICopIGxwdlBhcmFtID0gRkFMU0U7Ci0JCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJDb29sU3dpdGNoIiwgMSApICovCisJCSAgICBpZiAoIEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwgIkNvb2xTd2l0Y2giLCAxICkgPT0gMSApCisJCQkgICooQk9PTCAqKSBscHZQYXJhbSA9IFRSVUU7CisJCQllbHNlCisJCQkgICooQk9PTCAqKSBscHZQYXJhbSA9IEZBTFNFOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBTUElfR0VUR1JJREdSQU5VTEFSSVRZOgotCQkJKihJTlQgKikgbHB2UGFyYW0gPSAxOwotCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAiZGVza3RvcCIsICJHcmlkR3JhbnVsYXJpdHkiLCAxICkgKi8KLQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAqKElOVCAqKSBscHZQYXJhbSA9IEdldFByb2ZpbGVJbnQzMkEoICJkZXNrdG9wIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdyaWRHcmFudWxhcml0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogCQljYXNlIFNQSV9HRVRJQ09OVElUTEVXUkFQOgogCQkJKihCT09MICopIGxwdlBhcmFtID0gRkFMU0U7Ci0JCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50KCAiZGVza3RvcCIsICI/IiwgVHJ1ZSApICovCisJCQkvKiBGSVhNRSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsICI/IiwgVHJ1ZSApICovCiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRLRVlCT0FSRERFTEFZOgpAQCAtMTEwNSw5ICsxMTA5LDExIEBACiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9HRVRTQ1JFRU5TQVZFQUNUSVZFOgotCQkJLyogRklYTUUgR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiU2NyZWVuU2F2ZUFjdGl2ZSIsIDEgKTsgKi8KLQkJCSooQk9PTCAqKSBscHZQYXJhbSA9IEZBTFNFOwotCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmICggR2V0UHJvZmlsZUludDMyQSggIndpbmRvd3MiLCAiU2NyZWVuU2F2ZUFjdGl2ZSIsIDEgKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICooQk9PTCAqKSBscHZQYXJhbSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICooQk9PTCAqKSBscHZQYXJhbSA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogCQljYXNlIFNQSV9HRVRTQ1JFRU5TQVZFVElNRU9VVDoKIAkJCS8qIEZJWE1FIEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIlNjcmVlblNhdmVUaW1lb3V0IiwgMzAwICk7ICovCkBAIC0xMTE2LDE4ICsxMTIyLDIwIEBACiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9JQ09OSE9SSVpPTlRBTFNQQUNJTkc6CisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIEdldC9TZXRQcm9maWxlSW50ICovCiAJCQlpZiAobHB2UGFyYW0gPT0gTlVMTCkKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIlN5c3RlbVBhcmFtZXRlcnNJbmZvOiBIb3Jpem9udGFsIGljb24gc3BhY2luZyBzZXQgdG8gJWRcbi4iLCB1UGFyYW0pOwotCQkJZWxzZQotCQkJCSooSU5UICopIGxwdlBhcmFtID0gR2V0U3lzdGVtTWV0cmljcyggU01fQ1hJQ09OU1BBQ0lORyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU2V0U3lzdGVtTWV0cmljcyggU01fQ1hJQ09OU1BBQ0lORywgdVBhcmFtICkqLyA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihJTlQgKikgbHB2UGFyYW0gPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWElDT05TUEFDSU5HICk7CiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9JQ09OVkVSVElDQUxTUEFDSU5HOgotCQkJaWYgKGxwdlBhcmFtID09IE5VTEwpCi0JCQkJZnByaW50ZihzdGRlcnIsICJTeXN0ZW1QYXJhbWV0ZXJzSW5mbzogVmVydGljYWwgaWNvbiBzcGFjaW5nIHNldCB0byAlZFxuLiIsIHVQYXJhbSk7Ci0JCQllbHNlCi0JCQkJKihJTlQgKikgbHB2UGFyYW0gPSBHZXRTeXN0ZW1NZXRyaWNzKCBTTV9DWUlDT05TUEFDSU5HICk7Ci0JCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgR2V0L1NldFByb2ZpbGVJbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxwdlBhcmFtID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAvKlNldFN5c3RlbU1ldHJpY3MoIFNNX0NZSUNPTlNQQUNJTkcsIHVQYXJhbSApKi8gOworCQkgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKihJTlQgKikgbHB2UGFyYW0gPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZSUNPTlNQQUNJTkcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKIAogCQljYXNlIFNQSV9TRVRCRUVQOgogCQkJaWYgKHVQYXJhbSA9PSBUUlVFKQpAQCAtMTE0Nyw3ICsxMTU1LDcgQEAKIAogCQljYXNlIFNQSV9TRVRTQ1JFRU5TQVZFVElNRU9VVDoKIAkJCVhTZXRTY3JlZW5TYXZlcihkaXNwbGF5LCB1UGFyYW0sIDYwLCBEZWZhdWx0QmxhbmtpbmcsIAotCQkJCQkJRGVmYXVsdEV4cG9zdXJlcyk7CisJCQkJCQkJRGVmYXVsdEV4cG9zdXJlcyk7CiAJCQlicmVhazsKIAogCQljYXNlIFNQSV9TRVRERVNLV0FMTFBBUEVSOgpAQCAtMTE1Niw3ICsxMTY0LDcgQEAKIAogCQljYXNlIFNQSV9TRVRERVNLUEFUVEVSTjoKIAkJCWlmICgoSU5UKSB1UGFyYW0gPT0gLTEpIHsKLQkJCQlHZXRQcm9maWxlU3RyaW5nKCJEZXNrdG9wIiwgIlBhdHRlcm4iLCAKKwkJCQlHZXRQcm9maWxlU3RyaW5nMzJBKCJEZXNrdG9wIiwgIlBhdHRlcm4iLCAKIAkJCQkJCSIxNzAgODUgMTcwIDg1IDE3MCA4NSAxNzAgODUiLCAKIAkJCQkJCWJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikgKTsKIAkJCQlyZXR1cm4gKERFU0tUT1BfU2V0UGF0dGVybigoTFBTVFIpIGJ1ZmZlcikpOwpAQCAtMTE2NiwxOSArMTE3NCwyMCBAQAogCiAJICAgICAgICBjYXNlIFNQSV9HRVRJQ09OVElUTEVMT0dGT05UOiAKIAkgICAgICAgIHsKLQkJICAgIC8qIEZJWE1FIEdldFByb2ZpbGVTdHJpbmcoICI/IiwgIj8iLCAiPyIgKSAqLwotCQkgIExQTE9HRk9OVDE2IGxwTG9nRm9udCA9IChMUExPR0ZPTlQxNilscHZQYXJhbTsKLQkJICBscExvZ0ZvbnQtPmxmSGVpZ2h0ID0gMTA7Ci0JCSAgbHBMb2dGb250LT5sZldpZHRoID0gMDsKLQkJICBscExvZ0ZvbnQtPmxmRXNjYXBlbWVudCA9IGxwTG9nRm9udC0+bGZPcmllbnRhdGlvbiA9IDA7Ci0JCSAgbHBMb2dGb250LT5sZldlaWdodCA9IEZXX05PUk1BTDsKLQkJICBscExvZ0ZvbnQtPmxmSXRhbGljID0gbHBMb2dGb250LT5sZlN0cmlrZU91dCA9IGxwTG9nRm9udC0+bGZVbmRlcmxpbmUgPSBGQUxTRTsKLQkJICBscExvZ0ZvbnQtPmxmQ2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKLQkJICBscExvZ0ZvbnQtPmxmT3V0UHJlY2lzaW9uID0gT1VUX0RFRkFVTFRfUFJFQ0lTOwotCQkgIGxwTG9nRm9udC0+bGZDbGlwUHJlY2lzaW9uID0gQ0xJUF9ERUZBVUxUX1BSRUNJUzsKLQkJICBscExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgPSBERUZBVUxUX1BJVENIIHwgRkZfU1dJU1M7Ci0JCSAgYnJlYWs7Ci0JCX0KKwkJCSAgLyogRklYTUUgR2V0UHJvZmlsZVN0cmluZzMyQSggIj8iLCAiPyIsICI/IiApICovCisJCQkgIExQTE9HRk9OVDE2IGxwTG9nRm9udCA9IChMUExPR0ZPTlQxNilscHZQYXJhbTsKKwkJCSAgbHBMb2dGb250LT5sZkhlaWdodCA9IDEwOworCQkJICBscExvZ0ZvbnQtPmxmV2lkdGggPSAwOworCQkJICBscExvZ0ZvbnQtPmxmRXNjYXBlbWVudCA9IGxwTG9nRm9udC0+bGZPcmllbnRhdGlvbiA9IDA7CisJCQkgIGxwTG9nRm9udC0+bGZXZWlnaHQgPSBGV19OT1JNQUw7CisJCQkgIGxwTG9nRm9udC0+bGZJdGFsaWMgPSBscExvZ0ZvbnQtPmxmU3RyaWtlT3V0ID0gbHBMb2dGb250LT5sZlVuZGVybGluZSA9IEZBTFNFOworCQkJICBscExvZ0ZvbnQtPmxmQ2hhclNldCA9IEFOU0lfQ0hBUlNFVDsKKwkJCSAgbHBMb2dGb250LT5sZk91dFByZWNpc2lvbiA9IE9VVF9ERUZBVUxUX1BSRUNJUzsKKwkJCSAgbHBMb2dGb250LT5sZkNsaXBQcmVjaXNpb24gPSBDTElQX0RFRkFVTFRfUFJFQ0lTOworCQkJICBscExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgPSBERUZBVUxUX1BJVENIIHwgRkZfU1dJU1M7CisJCQkgIGJyZWFrOworCQkJfQorCiAJCWNhc2UgU1BJX0xBTkdEUklWRVI6CiAJCWNhc2UgU1BJX1NFVEJPUkRFUjoKIAkJY2FzZSBTUElfU0VURE9VQkxFQ0xLSEVJR0hUOgpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUybmxzLmMgYi9taXNjL29sZTJubHMuYwppbmRleCA2NmE3YTc0Li44NjY5ZjUwIDEwMDY0NAotLS0gYS9taXNjL29sZTJubHMuYworKysgYi9taXNjL29sZTJubHMuYwpAQCAtNCwxNiArNCwxMjYgQEAKICAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAgKi8KIAotLyoJQXQgdGhlIG1vbWVudCwgdGhlc2UgYXJlIG9ubHkgZW1wdHkgc3R1YnMuCi0gKi8KLQogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJvbGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCiAjaW5jbHVkZSAid2lubmxzLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInN0cmluZzMyLmgiCisKKy8qIExvY2FsZSBuYW1lIHRvIGlkIG1hcC4gdXNlZCBieSBFbnVtU3lzdGVtTG9jYWxlcywgR2V0TG9jYWxJbmZvQSAKKyAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAorICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgorICovIAorI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CitzdGF0aWMgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKKwljaGFyCSpuYW1lOworCURXT1JECWlkOworfSBsb2NhbGVfbmFtZTJpZFtdPSB7CisJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCisJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCisJTE9DQUxFX0VOVFJZKFNFTkdMQU5HVUFHRSksCisJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCisJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCisJTE9DQUxFX0VOVFJZKElDT1VOVFJZKSwKKwlMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAorCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCisJTE9DQUxFX0VOVFJZKFNBQkJSRVZDVFJZTkFNRSksCisJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCisJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAorCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPVU5UUlkpLAorCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKKwlMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAorCUxPQ0FMRV9FTlRSWShTTElTVCksCisJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKKwlMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAorCUxPQ0FMRV9FTlRSWShTVEhPVVNBTkQpLAorCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAorCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKKwlMT0NBTEVfRU5UUlkoSUxaRVJPKSwKKwlMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCisJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAorCUxPQ0FMRV9FTlRSWShTQ1VSUkVOQ1kpLAorCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCisJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKKwlMT0NBTEVfRU5UUlkoU01PTlRIT1VTQU5EU0VQKSwKKwlMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKKwlMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAorCUxPQ0FMRV9FTlRSWShJSU5UTENVUlJESUdJVFMpLAorCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAorCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCisJTE9DQUxFX0VOVFJZKFNEQVRFKSwKKwlMT0NBTEVfRU5UUlkoU1RJTUUpLAorCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKKwlMT0NBTEVfRU5UUlkoU0xPTkdEQVRFKSwKKwlMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAorCUxPQ0FMRV9FTlRSWShJREFURSksCisJTE9DQUxFX0VOVFJZKElMREFURSksCisJTE9DQUxFX0VOVFJZKElUSU1FKSwKKwlMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCisJTE9DQUxFX0VOVFJZKElDRU5UVVJZKSwKKwlMT0NBTEVfRU5UUlkoSVRMWkVSTyksCisJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCisJTE9DQUxFX0VOVFJZKElNT05MWkVSTyksCisJTE9DQUxFX0VOVFJZKFMxMTU5KSwKKwlMT0NBTEVfRU5UUlkoUzIzNTkpLAorCUxPQ0FMRV9FTlRSWShJQ0FMRU5EQVJUWVBFKSwKKwlMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAorCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAorCUxPQ0FMRV9FTlRSWShJRklSU1RXRUVLT0ZZRUFSKSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUUzKSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUU2KSwKKwlMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUyKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU1KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEpLAorCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCisJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTQpLAorCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCisJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTcpLAorCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCisJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEwKSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKKwlMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEzKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAorCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCisJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUzKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAorCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCisJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU2KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAorCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCisJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU5KSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEyKSwKKwlMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKKwlMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCisJTE9DQUxFX0VOVFJZKFNORUdBVElWRVNJR04pLAorCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAorCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAorCUxPQ0FMRV9FTlRSWShJUE9TU1lNUFJFQ0VERVMpLAorCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCisJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCisJTE9DQUxFX0VOVFJZKElORUdTRVBCWVNQQUNFKSwKKwl7TlVMTCwwfSwKK307CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4xKQpAQCAtODYsMTM3ICsxOTYsMzkgQEAKICAqLwogaW50IEdldExvY2FsZUluZm9BKERXT1JEIGxjaWQsRFdPUkQgTENUeXBlLExQU1RSIGJ1ZixXT1JEIGxlbikKIHsKLQljaGFyICpyZXRTdHJpbmc7Ci0gICAgaW50IHJldExlbjsKLSAgICBkcHJpbnRmX29sZShzdGRkZWIsIkdldExvY2FsZUluZm9BKCU4bFgsJThsWCwlcCwlNFgpXG4iLAorCWNoYXIJKnJldFN0cmluZzsKKwlpbnQJZm91bmQsaTsKKworCWRwcmludGZfb2xlKHN0ZGRlYiwiR2V0TG9jYWxlSW5mb0EoJThsWCwlOGxYLCVwLCU0WClcbiIsCiAJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKLSNpZiAwCi0JLyogV2luZSBpcyBzdXBwb3J0aW5nIG9ubHkgdGhlIGRlZmF1bHQgbG9jYWxlICovCi0JaWYobGNpZCE9R2V0VXNlckRlZmF1bHRMQ0lEKCkpCi0JewotCQlkcHJpbnRmX29sZShzdGRuaW1wLCJHZXRMb2NhbGVJbmZvQTogVW5rbm93biBsb2NhbGVcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0jZW5kaWYKIAkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgogCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCiAJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwogCXJldFN0cmluZz0wOwotCXJldExlbj0wOwogCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCiAJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQlpZih0eXBlPT1MQ1R5cGUpCQkJXAotCQkJCQkJCQl7cmV0TGVuPXN0cmxlbih2YWx1ZSkrMTtcCi0JCQkJCQkJCSByZXRTdHJpbmc9dmFsdWU7ICAgICAgIFwKLQkJCQkJCQkJfQotI2RlZmluZSBVTlNVUFBPUlRFRCh0eXBlKSAgIGlmKHR5cGU9PWxjaWQpcmV0U3RyaW5nPSN0eXBlOworCWk9MDsKKwl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgeworCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CisJCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOworCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKwlpZiAoIXJldFN0cmluZykgeworCQlmcHJpbnRmKHN0ZGVyciwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CisJCXJldHVybiAwOworCX0KIAotLyogSSByZWFsbHkgd2lzaCBJIHdvdWxkIGtub3cgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgKi8KLVVOU1VQUE9SVEVEKExPQ0FMRV9JTEFOR1VBR0UpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0xBTkdVQUdFKQotVU5TVVBQT1JURUQoTE9DQUxFX1NFTkdMQU5HVUFHRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUpCi1VTlNVUFBPUlRFRChMT0NBTEVfU05BVElWRUxBTkdOQU1FKQotVU5TVVBQT1JURUQoTE9DQUxFX0lDT1VOVFJZKQotVU5TVVBQT1JURUQoTE9DQUxFX1NDT1VOVFJZKQotVU5TVVBQT1JURUQoTE9DQUxFX1NFTkdDT1VOVFJZKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUpCi1VTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVENPVU5UUlkpCi1VTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TTElTVCkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JTUVBU1VSRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TREVDSU1BTCkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TVEhPVVNBTkQpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0dST1VQSU5HKQotVU5TVVBQT1JURUQoTE9DQUxFX0lESUdJVFMpCi1VTlNVUFBPUlRFRChMT0NBTEVfSUxaRVJPKQotVU5TVVBQT1JURUQoTE9DQUxFX0lORUdOVU1CRVIpCi1VTlNVUFBPUlRFRChMT0NBTEVfU05BVElWRURJR0lUUykKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQ1VSUkVOQ1kpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0lOVExTWU1CT0wpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQotVU5TVVBQT1JURUQoTE9DQUxFX1NNT05HUk9VUElORykKLVVOU1VQUE9SVEVEKExPQ0FMRV9JQ1VSUkRJR0lUUykKLVVOU1VQUE9SVEVEKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpCi1VTlNVUFBPUlRFRChMT0NBTEVfSUNVUlJFTkNZKQotVU5TVVBQT1JURUQoTE9DQUxFX0lORUdDVVJSKQotVU5TVVBQT1JURUQoTE9DQUxFX1NEQVRFKQotVU5TVVBQT1JURUQoTE9DQUxFX1NUSU1FKQotVU5TVVBQT1JURUQoTE9DQUxFX1NTSE9SVERBVEUpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0xPTkdEQVRFKQotVU5TVVBQT1JURUQoTE9DQUxFX1NUSU1FRk9STUFUKQotVU5TVVBQT1JURUQoTE9DQUxFX0lEQVRFKQotVU5TVVBQT1JURUQoTE9DQUxFX0lMREFURSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JVElNRSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JVElNRU1BUktQT1NOKQotVU5TVVBQT1JURUQoTE9DQUxFX0lDRU5UVVJZKQotVU5TVVBQT1JURUQoTE9DQUxFX0lUTFpFUk8pCi1VTlNVUFBPUlRFRChMT0NBTEVfSURBWUxaRVJPKQotVU5TVVBQT1JURUQoTE9DQUxFX0lNT05MWkVSTykKLVVOU1VQUE9SVEVEKExPQ0FMRV9TMTE1OSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TMjM1OSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQotVU5TVVBQT1JURUQoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQotVU5TVVBQT1JURUQoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKLVVOU1VQUE9SVEVEKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQotVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FMSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTIpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUzKQotVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNCkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTUpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU2KQotVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNykKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMykKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNikKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTIpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTMpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTQpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTUpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTYpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTcpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTgpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTkpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEwKQotVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxMSkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMTIpCi1VTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEzKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5KQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCkKLVVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEpCi1VTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyKQotVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMykKLVVOU1VQUE9SVEVEKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQotVU5TVVBQT1JURUQoTE9DQUxFX1NORUdBVElWRVNJR04pCi1VTlNVUFBPUlRFRChMT0NBTEVfSVBPU1NJR05QT1NOKQotVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTSUdOUE9TTikKLVVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCi1VTlNVUFBPUlRFRChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCi1VTlNVUFBPUlRFRChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQotVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQorI2RlZmluZSBMT0NWQUwodHlwZSx2YWx1ZSkgY2FzZSB0eXBlOnJldFN0cmluZz12YWx1ZTticmVhazsKIAogLyogTm93LCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXkgZG9uJ3QgaGF2ZSB0byBiZQogICAgY29tcGxldGUgKi8KKyAgICBmb3VuZD0xOwogICAgIHN3aXRjaChPcHRpb25zLmxhbmd1YWdlKQogICAgIHsKICAgICBjYXNlIExBTkdfRGU6CisgICAgCXN3aXRjaCAoTENUeXBlKSB7CiAvKiBUaGlzIGRlZmluaXRpb25zIGFwcGx5IHRvIEdlcm1hbnkgb25seS4gVXNlcnMgaW4gQXVzdHJpYSAKICAgIG9yIFN3aXR6ZXJsYW5kIG1pZ2h0IHdhbnQgdG8gbW9kaWZ5IHRoZW0gKi8KIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKQEAgLTMzOSw5ICszNTEsMTIgQEAKIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQogTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKICovCisJZGVmYXVsdDogZm91bmQ9MDticmVhazsKKwl9CiAgICAgYnJlYWs7ICAvKiBMQU5HKERlKSAqLwogCiAgICAgY2FzZSBMQU5HX0RhOgorICAgIAlzd2l0Y2ggKExDVHlwZSkgewogLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKSAqLwogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRhbnNrIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJEYW5pc2giKQpAQCAtNDQxLDkgKzQ1NiwxMiBAQAogLyogTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkgKi8KIC8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkgKi8KKwlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOworCX0KICAgICBicmVhazsgLyogTEFORyhEYSkgKi8KIAogICAgIGNhc2UgTEFOR19FbjoKKyAgICAJc3dpdGNoIChMQ1R5cGUpIHsKIC8qIFRoaXMgZGVmaW5pdGlvbnMgYXBwbHkgdG8gR2VybWFueSBvbmx5LiBVc2VycyBpbiBBdXN0cmlhIAogICAgb3IgU3dpdHplcmxhbmQgbWlnaHQgd2FudCB0byBtb2RpZnkgdGhlbSAqLwogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpAQCAtNTY2LDkgKzU4NCwxMiBAQAogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQogKi8KKwlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOworCX0KICAgICBicmVhazsgIC8qIExBTkcoRW4pICovCiAKICAgICBjYXNlIExBTkdfRW86CisgICAgCXN3aXRjaCAoTENUeXBlKSB7CiAvKiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpIElTTyBudW1lcmljYWwgSUQgZm9yIGxhbmd1YWdlIFRPRE8gKi8KIExPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJFc3BlcmFudG8iKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkVzcGVyYW50byIpCkBAIC02NjgsOSArNjg5LDEyIEBACiAvKiBMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKSAqLwogLyogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpICovCiAvKiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKSAqLworCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7CisJfQogICAgIGJyZWFrOyAgLyogTEFORyhFbykgKi8KIAogICAgIGNhc2UgTEFOR19GaToKKyAgICAJc3dpdGNoIChMQ1R5cGUpIHsKIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIxMSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiU3VvbWkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkZpbm5pc2giKQpAQCAtNzkxLDkgKzgxNSwxMiBAQAogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQogKi8KKwlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOworCX0KICAgICBicmVhazsgIC8qIExBTkcoRmkpICovCiAKICAgICBjYXNlIExBTkdfSXQ6CisgICAgCXN3aXRjaCAoTENUeXBlKSB7CiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiSXRhbGlhbm8iKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkl0YWxpYW4iKQpAQCAtOTE0LDkgKzk0MSwxMiBAQAogTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQogKi8KKwlkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOworCX0KICAgICBicmVhazsgIC8qIExBTkcoSXQpICovCiAKICAgICBjYXNlIDB4MDQwOToKKyAgICAJc3dpdGNoIChMQ1R5cGUpIHsKIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCAiMDQwOSIpCiBMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIikKIExPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCkBAIC0xMDE2LDkgKzEwNDYsMTIgQEAKIExPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UsICIwIikKIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCisJZGVmYXVsdDogZm91bmQ9MDticmVhazsKKwl9CiAgICAgYnJlYWs7IC8qIExBTkcoMHgwNDA5KSAoVS5TLiBFbmdsaXNoKSAqLwogCiAgICAgY2FzZSAweDA4MDk6CisgICAgCXN3aXRjaCAoTENUeXBlKSB7CiBMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA4MDkiKQogTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkiKQogTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsICJFbmdsaXNoIikKQEAgLTExMTgsMjUgKzExNTEsMjQgQEAKIExPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UsICIwIikKIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCisJZGVmYXVsdDogZm91bmQ9MDticmVhazsKKwl9CiAgICAgYnJlYWs7IC8qIExBTkcoMHgwODA5KSAoVS5LLiBFbmdsaXNoKSAqLwogCiAvKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCiAKICAgICBkZWZhdWx0OgorICAgIAlmb3VuZD0wOwogCWJyZWFrOwogICAgIH0gIC8qIHN3aXRjaCAqLwogCi0JaWYoIXJldExlbikKLQl7Ci0JCWlmKCFyZXRTdHJpbmcpZnByaW50ZihzdGRlcnIsIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwotCQllbHNlIGZwcmludGYoc3RkZXJyLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAorCWlmKCFmb3VuZCkgeworCQlmcHJpbnRmKHN0ZGVyciwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlLlxuIiwKIAkJCXJldFN0cmluZyk7CiAJCXJldHVybiAwOwogCX0KLQotCWlmKHJldExlbj5sZW4pcmV0TGVuPWxlbjsKIAlsc3RyY3B5bjMyQShidWYscmV0U3RyaW5nLGxlbik7Ci0JcmV0dXJuIHJldExlbjsKKwlyZXR1cm4gc3RybGVuKHJldFN0cmluZykrMTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjMwLDcgKzEyNjIsNTcgQEAKIAlyZXR1cm4gVFJVRTsKIH0KIAotQk9PTCBJc1ZhbGlkTG9jYWxlKERXT1JEIGxjaWQsRFdPUkQgZmxhZ3MpIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIklzVmFsaWRMb2NhbGUoJWxkLCVsZClcbiIsbGNpZCxmbGFncyk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc1ZhbGlkTG9jYWxlICAgICAgIChLRVJORUwzMi4zNjEpCisgKi8KK0JPT0wzMiBJc1ZhbGlkTG9jYWxlKERXT1JEIGxjaWQsRFdPUkQgZmxhZ3MpIHsKKwlpbnQJaTsKKworCWk9MDsKKwl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkKKwkJaWYgKGxvY2FsZV9uYW1lMmlkW2ldLmlkID09IGxjaWQpCisJCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJXICAgICAgICAgICAgICAgIChLRVJORUwzMi45MykKKyAqLworQk9PTDMyCitFbnVtU3lzdGVtTG9jYWxlczMyVyhMT0NBTEVfRU5VTVBST0MzMlcgbHBmbkxvY2FsZUVudW0sRFdPUkQgZmxhZ3MpIHsKKwlXQ0hBUgkqY3A7CisJaW50CWk7CisJQk9PTDMyCXJldDsKKworCWRwcmludGZfd2luMzIoc3RkZGViLCJFbnVtU3lzdGVtTG9jYWxlczMyVyglcCwlMDhseClcbiIsCisJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCisJKTsKKwlpPTA7CisJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKKwkJY3A9KExQV1NUUilTVFJJTkczMl9EdXBBbnNpVG9VbmkobG9jYWxlX25hbWUyaWRbaV0ubmFtZSk7CisJCXJldD1scGZuTG9jYWxlRW51bShjcCk7CisJCWZyZWUoY3ApOworCQlpZiAoIXJldCkgYnJlYWs7CisJCWkrKzsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJBICAgICAgICAgICAgICAgIChLRVJORUwzMi45MikKKyAqLworQk9PTDMyCitFbnVtU3lzdGVtTG9jYWxlczMyQShMT0NBTEVfRU5VTVBST0MzMkEgbHBmbkxvY2FsZUVudW0sRFdPUkQgZmxhZ3MpIHsKKwlpbnQJaTsKKworCWRwcmludGZfd2luMzIoc3RkZGViLCJFbnVtU3lzdGVtTG9jYWxlczMyQSglcCwlMDhseClcbiIsCisJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCisJKTsKKwlpPTA7CisJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKKwkJaWYgKCFscGZuTG9jYWxlRW51bShsb2NhbGVfbmFtZTJpZFtpXS5uYW1lKSkKKwkJCWJyZWFrOworCQlpKys7CisJfQogCXJldHVybiBUUlVFOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9yZWdpc3RyeS5jIGIvbWlzYy9yZWdpc3RyeS5jCmluZGV4IGNkZDY3NTEuLjkwYzAwMWEgMTAwNjQ0Ci0tLSBhL21pc2MvcmVnaXN0cnkuYworKysgYi9taXNjL3JlZ2lzdHJ5LmMKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCXJldHVybiBfc2F2ZXN1YmtleShGLGxwa2V5LT5uZXh0c3ViLDAsYWxsKTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBCT09MMzIKIF9zYXZlcmVnKExQS0VZU1RSVUNUIGxwa2V5LGNoYXIgKmZuLGludCBhbGwpIHsKIAlGSUxFCSpGOwogCkBAIC00NTksMTUgKzQ1OSwxNiBAQAogCQlmcHJpbnRmKHN0ZGRlYixfX0ZJTEVfXyI6X3NhdmVyZWc6Q291bGRuJ3Qgb3BlbiAlcyBmb3Igd3JpdGluZzogJXNcbiIsCiAJCQlmbixzdHJlcnJvcihlcnJubykKIAkJKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gRkFMU0U7CiAJfQogCWlmICghX3NhdmVzdWJyZWcoRixscGtleSxhbGwpKSB7CiAJCWZjbG9zZShGKTsKIAkJdW5saW5rKGZuKTsKIAkJZnByaW50ZihzdGRkZWIsX19GSUxFX18iOl9zYXZlcmVnOkZhaWxlZCB0byBzYXZlIGtleXMsIHBlcmhhcHMgbm8gbW9yZSBkaXNrc3BhY2UgZm9yICVzP1xuIixmbik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIEZBTFNFOwogCX0KIAlmY2xvc2UoRik7CisgICAgICAgIHJldHVybiBUUlVFOwogfQogCiB2b2lkCkBAIC01MDAsMTkgKzUwMSwyMiBAQAogCWlmIChsc3RyY21waTMyQShidWYsInllcyIpKQogCQlhbGw9MTsKIAlwd2Q9Z2V0cHd1aWQoZ2V0dWlkKCkpOwotCWlmIChwd2QhPU5VTEwgJiYgcHdkLT5wd19kaXIhPU5VTEwpIHsKLQkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX1VTRVJTX0RFRkFVTFQpKzIpOworCWlmIChwd2QhPU5VTEwgJiYgcHdkLT5wd19kaXIhPU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyICp0bXAgPSB0bXBuYW0oTlVMTCk7CisJCWZuPShjaGFyKil4bWFsbG9jKCBzdHJsZW4ocHdkLT5wd19kaXIpICsgc3RybGVuKFdJTkVfUFJFRklYKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihTQVZFX0NVUlJFTlRfVVNFUikgKyAyICk7CiAJCXN0cmNweShmbixwd2QtPnB3X2Rpcik7CiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCk7CiAJCS8qIGNyZWF0ZSB0aGUgZGlyZWN0b3J5LiBkb24ndCBjYXJlIGFib3V0IGVycm9yY29kZXMuICovCiAJCW1rZGlyKGZuLDA3NTUpOyAvKiBkcnd4ci14ci14ICovCiAJCXN0cmNhdChmbiwiLyJTQVZFX0NVUlJFTlRfVVNFUik7Ci0JCV9zYXZlcmVnKGtleV9jdXJyZW50X3VzZXIsZm4sYWxsKTsKKwkJaWYgKF9zYXZlcmVnKGtleV9jdXJyZW50X3VzZXIsdG1wLGFsbCkpIHJlbmFtZSh0bXAsZm4pOwogCQlmcmVlKGZuKTsKIAkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0xPQ0FMX01BQ0hJTkUpKzIpOwogCQlzdHJjcHkoZm4scHdkLT5wd19kaXIpOwogCQlzdHJjYXQoZm4sV0lORV9QUkVGSVgiLyJTQVZFX0xPQ0FMX01BQ0hJTkUpOwotCQlfc2F2ZXJlZyhrZXlfbG9jYWxfbWFjaGluZSxmbixhbGwpOworCQlpZiAoX3NhdmVyZWcoa2V5X2xvY2FsX21hY2hpbmUsdG1wLGFsbCkpIHJlbmFtZSh0bXAsZm4pOwogCQlmcmVlKGZuKTsKIAl9IGVsc2UKIAkJZnByaW50ZihzdGRlcnIsIlNIRUxMX1NhdmVSZWdpc3RyeTpmYWlsZWQgdG8gZ2V0IGhvbWVkaXJlY3Rvcnkgb2YgVUlEICVkLlxuIixnZXR1aWQoKSk7CkBAIC0xMzE1LDYgKzEzMTksMjE2IEBACiAJZnJlZShrZXlzKTsKIH0KIAorLyogV0lORE9XUyAzMSBSRUdJU1RSWSBMT0FERVIsIHN1cHBsaWVkIGJ5IFRvciBTavh3YWxsLCB0b3JAc24ubm8gKi8KKworLyoKKyAgICByZWdoYWNrIC0gd2luZG93cyAzLjExIHJlZ2lzdHJ5IGRhdGEgZm9ybWF0IGRlbW8gcHJvZ3JhbS4KKworICAgIFRoZSByZWcuZGF0IGZpbGUgaGFzIDMgcGFydHMsIGEgaGVhZGVyLCBhIHRhYmxlIG9mIDgtYnl0ZSBlbnRyaWVzIHRoYXQgaXMKKyAgICBhIGNvbWJpbmVkIGhhc2ggdGFibGUgYW5kIHRyZWUgZGVzY3JpcHRpb24sIGFuZCBmaW5hbGx5IGEgdGV4dCB0YWJsZS4KKworICAgIFRoZSBoZWFkZXIgaXMgb2J2aW91cyBmcm9tIHRoZSBzdHJ1Y3QgaGVhZGVyLiBUaGUgdGFib2ZmMSBhbmQgdGFib2ZmMgorICAgIGZpZWxkcyBhcmUgYWx3YXlzIDB4MjAsIGFuZCB0aGVpciB1c2FnZSBpcyB1bmtub3duLgorCisgICAgVGhlIDgtYnl0ZSBlbnRyeSB0YWJsZSBoYXMgdmFyaW91cyBlbnRyeSB0eXBlcy4KKworICAgIHRhYmVudFswXSBpcyBhIHJvb3QgaW5kZXguIFRoZSBzZWNvbmQgd29yZCBoYXMgdGhlIGluZGV4IG9mIHRoZSByb290IG9mCisgICAgICAgICAgICB0aGUgZGlyZWN0b3J5LgorICAgIHRhYmVudFsxLi5oYXNoc2l6ZV0gaXMgYSBoYXNoIHRhYmxlLiBUaGUgZmlyc3Qgd29yZCBpbiB0aGUgaGFzaCBlbnRyeSBpcworICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBrZXkvdmFsdWUgdGhhdCBoYXMgdGhhdCBoYXNoLiBEYXRhIHdpdGggdGhlIHNhbWUKKyAgICAgICAgICAgIGhhc2ggdmFsdWUgYXJlIG9uIGEgY2lyY3VsYXIgbGlzdC4gVGhlIG90aGVyIHRocmVlIHdvcmRzIGluIHRoZQorICAgICAgICAgICAgaGFzaCBlbnRyeSBhcmUgYWx3YXlzIHplcm8uCisgICAgdGFiZW50W2hhc2hzaXplLi50YWJjbnRdIGlzIHRoZSB0cmVlIHN0cnVjdHVyZS4gVGhlcmUgYXJlIHR3byBraW5kcyBvZgorICAgICAgICAgICAgZW50cnk6IGRpcmVudCBhbmQga2V5ZW50L3ZhbGVudC4gVGhleSBhcmUgaWRlbnRpZmllZCBieSBjb250ZXh0LgorICAgIHRhYmVudFtmcmVlaWR4XSBpcyB0aGUgZmlyc3QgZnJlZSBlbnRyeS4gVGhlIGZpcnN0IHdvcmQgaW4gYSBmcmVlIGVudHJ5CisgICAgICAgICAgICBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgZnJlZSBlbnRyeS4gVGhlIGxhc3QgaGFzIDAgYXMgYSBsaW5rLgorICAgICAgICAgICAgVGhlIG90aGVyIHRocmVlIHdvcmRzIGluIHRoZSBmcmVlIGxpc3QgYXJlIHByb2JhYmx5IGlycmVsZXZhbnQuCisKKyAgICBFbnRyaWVzIGluIHRleHQgdGFibGUgYXJlIHByZWNlZWRlZCBieSBhIHdvcmQgYXQgb2Zmc2V0LTIuIFRoaXMgd29yZAorICAgIGhhcyB0aGUgdmFsdWUgKDIqaW5kZXgpKzEsIHdoZXJlIGluZGV4IGlzIHRoZSByZWZlcnJpbmcga2V5ZW50L3ZhbGVudAorICAgIGVudHJ5IGluIHRoZSB0YWJsZS4gSSBoYXZlIG5vIHN1Z2dlc3Rpb24gZm9yIHRoZSAyKiBhbmQgdGhlICsxLgorICAgIEZvbGxvd2luZyB0aGUgd29yZCwgdGhlcmUgYXJlIE4gYnl0ZXMgb2YgZGF0YSwgYXMgcGVyIHRoZSBrZXllbnQvdmFsZW50CisgICAgZW50cnkgbGVuZ3RoLiBUaGUgb2Zmc2V0IG9mIHRoZSBrZXllbnQvdmFsZW50IGVudHJ5IGlzIGZyb20gdGhlIHN0YXJ0CisgICAgb2YgdGhlIHRleHQgdGFibGUgdG8gdGhlIGZpcnN0IGRhdGEgYnl0ZS4KKworICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmcm9tIE1pY3Jvc29mdC4gVGhlIGRhdGEgZm9ybWF0IGlzCisgICAgZGVkdWNlZCBmcm9tIHRoZSByZWcuZGF0IGZpbGUgYnkgbWUuIE1pc3Rha2VzIG1heQorICAgIGhhdmUgYmVlbiBtYWRlLiBJIGNsYWltIG5vIHJpZ2h0cyBhbmQgZ2l2ZSBubyBndWFyYW50ZWVzIGZvciB0aGlzIHByb2dyYW0uCisKKyAgICBUb3IgU2r4d2FsbCwgdG9yQHNuLm5vCisqLworCisvKiByZWcuZGF0IGhlYWRlciBmb3JtYXQgKi8KK3N0cnVjdCBfdzMxX2hlYWRlciB7CisJY2hhcgkJY29va2llWzhdOwkvKiAnU0hDQzMuMTAnICovCisJdW5zaWduZWQgbG9uZwl0YWJvZmYxOwkvKiBvZmZzZXQgb2YgaGFzaCB0YWJsZSAoPz8pID0gMHgyMCAqLworCXVuc2lnbmVkIGxvbmcJdGFib2ZmMjsJLyogb2Zmc2V0IG9mIGluZGV4IHRhYmxlICg/PykgPSAweDIwICovCisJdW5zaWduZWQgbG9uZwl0YWJjbnQ7CQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBpbmRleCB0YWJsZSAqLworCXVuc2lnbmVkIGxvbmcJdGV4dG9mZjsJLyogb2Zmc2V0IG9mIHRleHQgcGFydCAqLworCXVuc2lnbmVkIGxvbmcJdGV4dHNpemU7CS8qIGJ5dGUgc2l6ZSBvZiB0ZXh0IHBhcnQgKi8KKwl1bnNpZ25lZCBzaG9ydAloYXNoc2l6ZTsJLyogaGFzaCBzaXplICovCisJdW5zaWduZWQgc2hvcnQJZnJlZWlkeDsJLyogZnJlZSBpbmRleCAqLworfTsKKworLyogZ2VuZXJpYyBmb3JtYXQgb2YgdGFibGUgZW50cmllcyAqLworc3RydWN0IF93MzFfdGFiZW50IHsKKwl1bnNpZ25lZCBzaG9ydCB3MCwgdzEsIHcyLCB3MzsKK307CisKKy8qIGRpcmVjdG9yeSB0YWJlbnQ6ICovCitzdHJ1Y3QgX3czMV9kaXJlbnQgeworCXVuc2lnbmVkIHNob3J0CXNpYmxpbmdfaWR4OwkvKiB0YWJsZSBpbmRleCBvZiBzaWJsaW5nIGRpcmVudCAqLworCXVuc2lnbmVkIHNob3J0CWNoaWxkX2lkeDsJLyogdGFibGUgaW5kZXggb2YgY2hpbGQgZGlyZW50ICovCisJdW5zaWduZWQgc2hvcnQJa2V5X2lkeDsJLyogdGFibGUgaW5kZXggb2Yga2V5IGtleWVudCAqLworCXVuc2lnbmVkIHNob3J0CXZhbHVlX2lkeDsJLyogdGFibGUgaW5kZXggb2YgdmFsdWUgdmFsZW50ICovCit9OworCisvKiBrZXkgdGFiZW50OiAqLworc3RydWN0IF93MzFfa2V5ZW50IHsKKwl1bnNpZ25lZCBzaG9ydAloYXNoX2lkeDsJLyogaGFzaCBjaGFpbiBpbmRleCBmb3Igc3RyaW5nICovCisJdW5zaWduZWQgc2hvcnQJcmVmY250OwkJLyogcmVmZXJlbmNlIGNvdW50ICovCisJdW5zaWduZWQgc2hvcnQJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN0cmluZyAqLworCXVuc2lnbmVkIHNob3J0CXN0cmluZ19vZmY7CS8qIG9mZnNldCBvZiBzdHJpbmcgaW4gdGV4dCB0YWJsZSAqLworfTsKKworLyogdmFsdWUgdGFiZW50OiAqLworc3RydWN0IF93MzFfdmFsZW50IHsKKwl1bnNpZ25lZCBzaG9ydAloYXNoX2lkeDsJLyogaGFzaCBjaGFpbiBpbmRleCBmb3Igc3RyaW5nICovCisJdW5zaWduZWQgc2hvcnQJcmVmY250OwkJLyogcmVmZXJlbmNlIGNvdW50ICovCisJdW5zaWduZWQgc2hvcnQJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN0cmluZyAqLworCXVuc2lnbmVkIHNob3J0CXN0cmluZ19vZmY7CS8qIG9mZnNldCBvZiBzdHJpbmcgaW4gdGV4dCB0YWJsZSAqLworfTsKKworLyogcmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiB0byBkaXNwbGF5IGEgZGlyZWN0b3J5IHRyZWUgKi8KK3ZvaWQKK19fdzMxX2R1bXB0cmVlKAl1bnNpZ25lZCBzaG9ydCBpZHgsCisJCXVuc2lnbmVkIGNoYXIgKnR4dCwKKwkJc3RydWN0IF93MzFfdGFiZW50ICp0YWIsCisJCXN0cnVjdCBfdzMxX2hlYWRlciAqaGVhZCwKKwkJTFBLRVlTVFJVQ1QJbHBrZXksCisJCXRpbWVfdAkJbGFzdG1vZGlmaWVkLAorCQlpbnQJCWxldmVsCispIHsKKwlzdHJ1Y3QgX3czMV9kaXJlbnQJKmRpcjsKKwlzdHJ1Y3QgX3czMV9rZXllbnQJKmtleTsKKwlzdHJ1Y3QgX3czMV92YWxlbnQJKnZhbDsKKwlMUEtFWVNUUlVDVAkJeGxwa2V5OworCUxQV1NUUgkJCW5hbWUsdmFsdWU7CisJc3RhdGljIGNoYXIJCXRhaWxbNDAwXTsKKworCXdoaWxlIChpZHghPTApIHsKKwkJZGlyPShzdHJ1Y3QgX3czMV9kaXJlbnQqKSZ0YWJbaWR4XTsKKworCQlpZiAoZGlyLT5rZXlfaWR4KSB7CisJCQlrZXkgPSAoc3RydWN0IF93MzFfa2V5ZW50KikmdGFiW2Rpci0+a2V5X2lkeF07CisKKwkJCW1lbWNweSh0YWlsLCZ0eHRba2V5LT5zdHJpbmdfb2ZmXSxrZXktPmxlbmd0aCk7CisJCQl0YWlsW2tleS0+bGVuZ3RoXT0nXDAnOworCQkJLyogYWxsIHRvcGxldmVsIGVudHJpZXMgQU5EIHRoZSBlbnRyaWVzIGluIHRoZSAKKwkJCSAqIHRvcGxldmVsIHN1YmRpcmVjdG9yeSBiZWxvbmcgdG8gXFNPRlRXQVJFXENsYXNzZXMKKwkJCSAqLworCQkJaWYgKCFsZXZlbCAmJiAhbHN0cmNtcDMyQSh0YWlsLCIuY2xhc3NlcyIpKSB7CisJCQkJX193MzFfZHVtcHRyZWUoZGlyLT5jaGlsZF9pZHgsdHh0LHRhYixoZWFkLGxwa2V5LGxhc3Rtb2RpZmllZCxsZXZlbCsxKTsKKwkJCQlpZHg9ZGlyLT5zaWJsaW5nX2lkeDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW5hbWU9U1RSSU5HMzJfRHVwQW5zaVRvVW5pKHRhaWwpOworCisJCQl4bHBrZXk9X2ZpbmRfb3JfYWRkX2tleShscGtleSxuYW1lKTsKKworCQkJLyogb25seSBhZGQgaWYgbGVhZiBub2RlIG9yIHZhbHVlZCBub2RlICovCisJCQlpZiAoZGlyLT52YWx1ZV9pZHghPTB8fGRpci0+Y2hpbGRfaWR4PT0wKSB7CisJCQkJaWYgKGRpci0+dmFsdWVfaWR4KSB7CisJCQkJCXZhbD0oc3RydWN0IF93MzFfdmFsZW50KikmdGFiW2Rpci0+dmFsdWVfaWR4XTsKKwkJCQkJbWVtY3B5KHRhaWwsJnR4dFt2YWwtPnN0cmluZ19vZmZdLHZhbC0+bGVuZ3RoKTsKKwkJCQkJdGFpbFt2YWwtPmxlbmd0aF09J1wwJzsKKwkJCQkJdmFsdWU9U1RSSU5HMzJfRHVwQW5zaVRvVW5pKHRhaWwpOworCQkJCQlfZmluZF9vcl9hZGRfdmFsdWUoeGxwa2V5LE5VTEwsUkVHX1NaLChMUEJZVEUpdmFsdWUsbHN0cmxlbjMyVyh2YWx1ZSkqMisyLGxhc3Rtb2RpZmllZCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZHByaW50Zl9yZWcoc3RkZGViLCJfX3czMV9kdW1wdHJlZTpzdHJhbmdlOiBubyBkaXJlY3Rvcnkga2V5IG5hbWUsIGlkeD0lMDR4XG4iLCBpZHgpOworCQl9CisJCV9fdzMxX2R1bXB0cmVlKGRpci0+Y2hpbGRfaWR4LHR4dCx0YWIsaGVhZCx4bHBrZXksbGFzdG1vZGlmaWVkLGxldmVsKzEpOworCQlpZHg9ZGlyLT5zaWJsaW5nX2lkeDsKKwl9Cit9CisKK3ZvaWQKK193MzFfbG9hZHJlZygpIHsKKwlIRklMRQkJCWhmOworCXN0cnVjdCBfdzMxX2hlYWRlcgloZWFkOworCXN0cnVjdCBfdzMxX3RhYmVudAkqdGFiOworCXVuc2lnbmVkIGNoYXIJCSp0eHQ7CisJaW50CQkJbGVuOworCU9GU1RSVUNUCQlvZnM7CisJQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaGZpbmZvOworCXRpbWVfdAkJCWxhc3Rtb2RpZmllZDsKKwlIS0VZCQkJaGtleTsKKwlMUEtFWVNUUlVDVAkJbHBrZXk7CisKKwloZiA9IE9wZW5GaWxlKCJyZWcuZGF0Iiwmb2ZzLE9GX1JFQUQpOworCWlmIChoZj09SEZJTEVfRVJST1IpCisJCXJldHVybjsKKworCS8qIHJlYWQgJiBkdW1wIGhlYWRlciAqLworCWlmIChzaXplb2YoaGVhZCkhPV9scmVhZDMyKGhmLCZoZWFkLHNpemVvZihoZWFkKSkpIHsKKwkJZHByaW50Zl9yZWcoc3RkZGViLCJfdzMxX2xvYWRyZWc6cmVnLmRhdCBpcyB0b28gc2hvcnQuXG4iKTsKKwkJX2xjbG9zZShoZik7CisJCXJldHVybjsKKwl9CisJaWYgKG1lbWNtcChoZWFkLmNvb2tpZSwgIlNIQ0MzLjEwIiwgc2l6ZW9mKGhlYWQuY29va2llKSkhPTApIHsKKwkJZHByaW50Zl9yZWcoc3RkZGViLCJfdzMxX2xvYWRyZWc6cmVnLmRhdCBoYXMgYmFkIHNpZ25hdHVyZS5cbiIpOworCQlfbGNsb3NlKGhmKTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IGhlYWQudGFiY250ICogc2l6ZW9mKHN0cnVjdCBfdzMxX3RhYmVudCk7CisJLyogcmVhZCBhbmQgZHVtcCBpbmRleCB0YWJsZSAqLworCXRhYiA9IHhtYWxsb2MobGVuKTsKKwlpZiAobGVuIT1fbHJlYWQzMihoZix0YWIsbGVuKSkgeworCQlkcHJpbnRmX3JlZyhzdGRlcnIsIl93MzFfbG9hZHJlZzpjb3VsZG4ndCByZWFkICVkIGJ5dGVzLlxuIixsZW4pOyAKKwkJZnJlZSh0YWIpOworCQlfbGNsb3NlKGhmKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlYWQgdGV4dCAqLworCXR4dCA9IHhtYWxsb2MoaGVhZC50ZXh0c2l6ZSk7CisJaWYgKC0xPT1fbGxzZWVrKGhmLGhlYWQudGV4dG9mZixTRUVLX1NFVCkpIHsKKwkJZHByaW50Zl9yZWcoc3RkZXJyLCJfdzMxX2xvYWRyZWc6Y291bGRuJ3Qgc2VlayB0byB0ZXh0YmxvY2suXG4iKTsgCisJCWZyZWUodGFiKTsKKwkJZnJlZSh0eHQpOworCQlfbGNsb3NlKGhmKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaGVhZC50ZXh0c2l6ZSE9X2xyZWFkMzIoaGYsdHh0LGhlYWQudGV4dHNpemUpKSB7CisJCWRwcmludGZfcmVnKHN0ZGVyciwiX3czMV9sb2FkcmVnOnRleHRibG9jayB0b28gc2hvcnQgKCVkIGluc3RlYWQgb2YgJWxkKS5cbiIsbGVuLGhlYWQudGV4dHNpemUpOyAKKwkJZnJlZSh0YWIpOworCQlmcmVlKHR4dCk7CisJCV9sY2xvc2UoaGYpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShoZiwmaGZpbmZvKSkgeworCQlkcHJpbnRmX3JlZyhzdGRlcnIsIl93MzFfbG9hZHJlZzpHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZSBmYWlsZWQ/LlxuIik7IAorCQlmcmVlKHRhYik7CisJCWZyZWUodHh0KTsKKwkJX2xjbG9zZShoZik7CisJCXJldHVybjsKKwl9CisJbGFzdG1vZGlmaWVkCT0gRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCYoaGZpbmZvLmZ0TGFzdFdyaXRlVGltZSkpOworCisJaWYgKFJlZ0NyZWF0ZUtleTE2KEhLRVlfTE9DQUxfTUFDSElORSwiXFxTT0ZUV0FSRVxcQ2xhc3NlcyIsJmhrZXkpIT1FUlJPUl9TVUNDRVNTKQorCQlyZXR1cm47CisJbHBrZXkgPSBsb29rdXBfaGtleShoa2V5KTsKKwlfX3czMV9kdW1wdHJlZSh0YWJbMF0udzEsdHh0LHRhYiwmaGVhZCxscGtleSxsYXN0bW9kaWZpZWQsMCk7CisJZnJlZSh0YWIpOworCWZyZWUodHh0KTsKKwlfbGNsb3NlKGhmKTsKKwlyZXR1cm47Cit9CisKIHZvaWQKIFNIRUxMX0xvYWRSZWdpc3RyeSgpIHsKIAljaGFyCSpmbjsKQEAgLTEzMjYsMTMgKzE1NDAsMTMgQEAKIAlpZiAoa2V5X2NsYXNzZXNfcm9vdD09TlVMTCkKIAkJU0hFTExfSW5pdCgpOwogCisJLyogTG9hZCB3aW5kb3dzIDMuMSBlbnRyaWVzICovCisJX3czMV9sb2FkcmVnKCk7CiAJLyogTG9hZCB3aW5kb3dzIDk1IGVudHJpZXMgKi8KIAlfdzk1X2xvYWRyZWcoIkM6XFxzeXN0ZW0uMXN0IiwJa2V5X2xvY2FsX21hY2hpbmUpOwogCV93OTVfbG9hZHJlZygic3lzdGVtLmRhdCIsCWtleV9sb2NhbF9tYWNoaW5lKTsKIAlfdzk1X2xvYWRyZWcoInVzZXIuZGF0IiwJa2V5X3VzZXJzKTsKIAotCS8qIEZJWE1FOiB3aW4zLjEgcmVnLmRhdCBsb2FkZXIgc3RpbGwgbWlzc2luZyAqLwotCiAJLyogdGhlIGdsb2JhbCB1c2VyIGRlZmF1bHQgaXMgbG9hZGVkIHVuZGVyIEhLRVlfVVNFUlNcXC5EZWZhdWx0ICovCiAJUmVnQ3JlYXRlS2V5MTYoSEtFWV9VU0VSUywiLkRlZmF1bHQiLCZoa2V5KTsKIAlscGtleSA9IGxvb2t1cF9oa2V5KGhrZXkpOwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDNhOTY4OTcuLjJmOWNjOGIgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTE5NSwyOSArMTk1LDM0IEBACiAgICAgLyogZXh0ZW5zaW9uczsgaG93ZXZlciwgaXQnZCBtYWtlIHNlbnNlIHRvIGNoZWNrIHRoZSBwcm9ncmFtcyAqLwogICAgIC8qIHNlY3Rpb24gZmlyc3QsIHNvIHRoYXQncyB3aGF0IGhhcHBlbnMgaGVyZS4gKi8KIAotICAgIC8qIFNlZSBpZiBpdCdzIGEgcHJvZ3JhbSAqLwotICAgIEdldFByb2ZpbGVTdHJpbmcoIndpbmRvd3MiLCAicHJvZ3JhbXMiLCAiZXhlIHBpZiBiYXQgY29tIiwKLQkJICAgICAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7IC8qIEZJWE1FIGNoZWNrIHJldHVybiBjb2RlISAqLworICAgIC8qIFNlZSBpZiBpdCdzIGEgcHJvZ3JhbSAtIGlmIEdldFByb2ZpbGVTdHJpbmcgZmFpbHMsIHdlIHNraXAgdGhpcworICAgICAqIHNlY3Rpb24uIEFjdHVhbGx5LCBpZiBHZXRQcm9maWxlU3RyaW5nIGZhaWxzLCB3ZSd2ZSBwcm9iYWJseQorICAgICAqIGdvdCBhIGxvdCBtb3JlIHRvIHdvcnJ5IGFib3V0IHRoYW4gcnVubmluZyBhIHByb2dyYW0uLi4gKi8KKyAgICBpZiAoIEdldFByb2ZpbGVTdHJpbmczMkEoIndpbmRvd3MiLCAicHJvZ3JhbXMiLCAiZXhlIHBpZiBiYXQgY29tIiwKKwkJCQkJCSAgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkgPiAwICkKKwkgIHsKKwkJZm9yIChpPTA7aTxzdHJsZW4oYnVmZmVyKTsgaSsrKSBidWZmZXJbaV09dG9sb3dlcihidWZmZXJbaV0pOwogCi0gICAgZm9yIChpPTA7aTxzdHJsZW4oYnVmZmVyKTsgaSsrKSBidWZmZXJbaV09dG9sb3dlcihidWZmZXJbaV0pOworCQl0b2sgPSBzdHJ0b2soYnVmZmVyLCAiIFx0Iik7IC8qID8gKi8KKwkJd2hpbGUoIHRvayE9IE5VTEwpCisJCSAgeworCQkJaWYgKHN0cmNtcCh0b2ssICZ0bXBleHRbMV0pPT0wKSAvKiBoYXZlIHRvIHNraXAgdGhlIGxlYWRpbmcgIi4iICovCisJCQkgIHsKKwkJCQlzdHJjcHkobHBSZXN1bHQsIHhscEZpbGUpOworCQkJCS8qIE5lZWQgdG8gcGVyaGFwcyBjaGVjayB0aGF0IHRoZSBmaWxlIGhhcyBhIHBhdGgKKwkJCQkgKiBhdHRhY2hlZCAqLworCQkJCWRwcmludGZfZXhlYyhzdGRkZWIsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogZm91bmQgJXNcbiIsCisJCQkJCQkJIGxwUmVzdWx0KTsKKwkgICAgcmV0dXJuIDMzOwogCi0gICAgdG9rID0gc3RydG9rKGJ1ZmZlciwgIiBcdCIpOyAvKiA/ICovCi0gICAgd2hpbGUoIHRvayE9IE5VTEwpCi0gICAgewotCWlmIChzdHJjbXAodG9rLCAmdG1wZXh0WzFdKT09MCkgLyogaGF2ZSB0byBza2lwIHRoZSBsZWFkaW5nICIuIiAqLwotCXsKLQkgICAgc3RyY3B5KGxwUmVzdWx0LCB4bHBGaWxlKTsgLyogTmVlZCB0byBwZXJoYXBzIGNoZWNrIHRoYXQgKi8KLQkJCQkgICAgICAvKiB0aGUgZmlsZSBoYXMgYSBwYXRoIGF0dGFjaGVkICovCi0JICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTSEVMTF9GaW5kRXhlY3V0YWJsZTogZm91bmQgJXNcbiIsCi0JCQkgbHBSZXN1bHQpOwotCSAgICByZXR1cm4gMzM7IC8qIEdyZWF0ZXIgdGhhbiAzMiB0byBpbmRpY2F0ZSBzdWNjZXNzIEZJWE1FICovCi0JCSAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIGRvY3MsIEkgc2hvdWxkIGJlIHJldHVybmluZyAqLwotCQkgICAgICAgLyogYSBoYW5kbGUgZm9yIHRoZSBleGVjdXRhYmxlLiBEb2VzIHRoaXMgbWVhbiAqLwotCQkgICAgICAgLyogSSdtIHN1cHBvc2VkIHRvIG9wZW4gdGhlIGV4ZWN1dGFibGUgZmlsZSBvciAqLwotCQkgICAgICAgLyogc29tZXRoaW5nPyBNb3JlIFJURk0sIEkgZ3Vlc3MuLi4gKi8KLQl9Ci0JdG9rPXN0cnRvayhOVUxMLCAiIFx0Iik7Ci0gICAgfQorCQkvKiBHcmVhdGVyIHRoYW4gMzIgdG8gaW5kaWNhdGUgc3VjY2VzcyBGSVhNRSBBY2NvcmRpbmcgdG8gdGhlCisJCSAqIGRvY3MsIEkgc2hvdWxkIGJlIHJldHVybmluZyBhIGhhbmRsZSBmb3IgdGhlCisJCSAqIGV4ZWN1dGFibGUuIERvZXMgdGhpcyBtZWFuIEknbSBzdXBwb3NlZCB0byBvcGVuIHRoZQorCQkgKiBleGVjdXRhYmxlIGZpbGUgb3Igc29tZXRoaW5nPyBNb3JlIFJURk0sIEkgZ3Vlc3MuLi4gKi8KKwkJCSAgfQorCQkJdG9rPXN0cnRvayhOVUxMLCAiIFx0Iik7CisJCSAgfQorCSAgfQogCiAgICAgLyogQ2hlY2sgcmVnaXN0cnkgKi8KICAgICBpZiAoUmVnUXVlcnlWYWx1ZTE2KCAoSEtFWSlIS0VZX0NMQVNTRVNfUk9PVCwgdG1wZXh0LCBmaWxldHlwZSwKQEAgLTI0OSwzMiArMjU0LDM0IEBACiAJCSAgICBzdHJjYXQoIGxwUmVzdWx0LCAmdG9rWzJdICk7CiAJCX0KIAkgICAgfQotCSAgICByZXR2YWw9MzM7CisJICAgIHJldHZhbD0zMzsgLyogRklYTUUgc2VlIGFib3ZlICovCiAJfQogICAgIH0KICAgICBlbHNlIC8qIENoZWNrIHdpbi5pbmkgKi8KICAgICB7CiAJLyogVG9zcyB0aGUgbGVhZGluZyBkb3QgKi8KIAlleHRlbnNpb24rKzsKLQlHZXRQcm9maWxlU3RyaW5nKCAiZXh0ZW5zaW9ucyIsIGV4dGVuc2lvbiwgIiIsIGNvbW1hbmQsCi0JCQkgc2l6ZW9mKGNvbW1hbmQpKTsKLQlpZiAoc3RybGVuKGNvbW1hbmQpIT0wKQotCXsKLQkgICAgc3RyY3B5KCBscFJlc3VsdCwgY29tbWFuZCApOwotCSAgICB0b2s9c3Ryc3RyKCBscFJlc3VsdCwgIl4iICk7IC8qIHNob3VsZCBiZSBeLmV4dGVuc2lvbj8gKi8KLQkgICAgaWYgKHRvayAhPSBOVUxMKQotCSAgICB7Ci0JCXRva1swXT0nXDAnOwotCQlzdHJjYXQoIGxwUmVzdWx0LCB4bHBGaWxlICk7IC8qIHdoYXQgaWYgbm8gZGlyIGluIHhscEZpbGU/ICovCi0JCXRvaz1zdHJzdHIoIGNvbW1hbmQsICJeIiApOyAvKiBzZWUgYWJvdmUgKi8KLQkJaWYgKCh0b2sgIT0gTlVMTCkgJiYgKHN0cmxlbih0b2spPjUpKQotCQl7Ci0JCSAgICBzdHJjYXQoIGxwUmVzdWx0LCAmdG9rWzVdKTsKLQkJfQotCSAgICB9Ci0JICAgIHJldHZhbD0zMzsKKwlpZiAoIEdldFByb2ZpbGVTdHJpbmczMkEoICJleHRlbnNpb25zIiwgZXh0ZW5zaW9uLCAiIiwgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY29tbWFuZCkpID4gMCkKKwkgIHsKKwkJaWYgKHN0cmxlbihjb21tYW5kKSE9MCkKKwkJICB7CisJCQlzdHJjcHkoIGxwUmVzdWx0LCBjb21tYW5kICk7CisJCQl0b2s9c3Ryc3RyKCBscFJlc3VsdCwgIl4iICk7IC8qIHNob3VsZCBiZSBeLmV4dGVuc2lvbj8gKi8KKwkJCWlmICh0b2sgIT0gTlVMTCkKKwkJCSAgeworCQkJCXRva1swXT0nXDAnOworCQkJCXN0cmNhdCggbHBSZXN1bHQsIHhscEZpbGUgKTsgLyogd2hhdCBpZiBubyBkaXIgaW4geGxwRmlsZT8gKi8KKwkJCQl0b2s9c3Ryc3RyKCBjb21tYW5kLCAiXiIgKTsgLyogc2VlIGFib3ZlICovCisJCQkJaWYgKCh0b2sgIT0gTlVMTCkgJiYgKHN0cmxlbih0b2spPjUpKQorCQkJCSAgeworCQkJCQlzdHJjYXQoIGxwUmVzdWx0LCAmdG9rWzVdKTsKKwkJCQkgIH0KKwkJCSAgfQorCQkJcmV0dmFsPTMzOyAvKiBGSVhNRSAtIHNlZSBhYm92ZSAqLworCQkgIH0KKwkgIH0KIAl9Ci0gICAgfQogCiAgICAgZHByaW50Zl9leGVjKHN0ZGRlYiwgIlNIRUxMX0ZpbmRFeGVjdXRhYmxlOiByZXR1cm5pbmcgJXNcbiIsIGxwUmVzdWx0KTsKICAgICByZXR1cm4gcmV0dmFsOwpAQCAtODA0LDcgKzgxMSw3IEBACiAgKi8KIGludCBSZWdpc3RlclNoZWxsSG9vayh2b2lkICpwdHIpIAogewotCWZwcmludGYoc3RkbmltcCwgIlJlZ2lzdGVyU2hlbGxIb29rIDogRW1wdHkgU3R1YiAhISFcbiIpOworCWZwcmludGYoc3RkbmltcCwgIlJlZ2lzdGVyU2hlbGxIb29rKCAlcCApIDogRW1wdHkgU3R1YiAhISFcbiIsIHB0cik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2Mvc3B5LmMgYi9taXNjL3NweS5jCmluZGV4IDU3Y2U5ZDkuLjFiMDBkMzkgMTAwNjQ0Ci0tLSBhL21pc2Mvc3B5LmMKKysrIGIvbWlzYy9zcHkuYwpAQCAtMjk2LDcgKzI5Niw4IEBACiAgICAgIkxCX1NFVElURU1IRUlHSFQzMiIsICAgICAgIC8qIDB4MDFhMCAqLwogICAgICJMQl9HRVRJVEVNSEVJR0hUMzIiLCAgICAgICAvKiAweDAxYTEgKi8KICAgICAiTEJfRklORFNUUklOR0VYQUNUMzIiLCAgICAgLyogMHgwMWEyICovCi0gICAgTlVMTCwgTlVMTCwKKyAgICAiTEJfQ0FSRVRPTjMyIiwgICAgICAgICAgICAgLyogMHgwMWEzICovCisgICAgIkxCX0NBUkVUT0ZGMzIiLCAgICAgICAgICAgIC8qIDB4MDFhNCAqLwogICAgICJMQl9TRVRMT0NBTEUzMiIsICAgICAgICAgICAvKiAweDAxYTUgKi8KICAgICAiTEJfR0VUTE9DQUxFMzIiLCAgICAgICAgICAgLyogMHgwMWE2ICovCiAgICAgIkxCX1NFVENPVU5UMzIiLCAgICAgICAgICAgIC8qIDB4MDFhNyAqLwpkaWZmIC0tZ2l0IGEvbWlzYy91c2VyLmMgYi9taXNjL3VzZXIuYwppbmRleCAzNTE2YTc4Li42OGE5MWE1IDEwMDY0NAotLS0gYS9taXNjL3VzZXIuYworKysgYi9taXNjL3VzZXIuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgaW50IHF1ZXVlU2l6ZTsKIAogICAgICAgLyogQ3JlYXRlIHRhc2sgbWVzc2FnZSBxdWV1ZSAqLwotICAgIHF1ZXVlU2l6ZSA9IEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwgIkRlZmF1bHRRdWV1ZVNpemUiLCA4ICk7CisgICAgcXVldWVTaXplID0gR2V0UHJvZmlsZUludDMyQSggIndpbmRvd3MiLCAiRGVmYXVsdFF1ZXVlU2l6ZSIsIDggKTsKICAgICBpZiAoIVNldE1lc3NhZ2VRdWV1ZSggcXVldWVTaXplICkpIHJldHVybiAwOwogCiAgICAgcmV0dXJuIDE7CkBAIC0xMTIsOCArMTEyLDcgQEAKICAqLwogdm9pZCBVU0VSX0FwcEV4aXQoIEhUQVNLMTYgaFRhc2ssIEhJTlNUQU5DRTE2IGhJbnN0YW5jZSwgSFFVRVVFMTYgaFF1ZXVlICkKIHsKLSAgICAvKiBGSVhNRTogZmx1c2ggc2VuZCBtZXNzYWdlcyAod2hpY2ggYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQpLAotICAgICAqICAgICAgICBlbXB0eSBjbGlwYm9hcmQgaWYgbmVlZGVkLCBtYXliZSBkZXN0cm95IG1lbnVzIChXaW5kb3dzCisgICAgLyogRklYTUU6IGVtcHR5IGNsaXBib2FyZCBpZiBuZWVkZWQsIG1heWJlIGRlc3Ryb3kgbWVudXMgKFdpbmRvd3MKICAgICAgKgkgICAgICBvbmx5IGNvbXBsYWlucyBhYm91dCB0aGVtIGJ1dCBkb2VzIG5vdGhpbmcpOwogICAgICAqLwogCkBAIC0xMjYsMTggKzEyNSwxMyBAQAogICAgIC8qIFBhdGNoIHJlc2lkZW50IHBvcHVwIG1lbnUgd2luZG93ICovCiAgICAgTUVOVV9Td2l0Y2hUUFduZFRvKDApOwogCi0gICAgLyogTnVrZSB0aW1lcnMgKi8KLQogICAgIFRJTUVSX1JlbW92ZVF1ZXVlVGltZXJzKCBoUXVldWUgKTsKIAorICAgIFFVRVVFX0ZsdXNoTWVzc2FnZXMoIGhRdWV1ZSApOwogICAgIEhPT0tfRnJlZVF1ZXVlSG9va3MoIGhRdWV1ZSApOwogCiAgICAgUVVFVUVfU2V0RG9vbWVkUXVldWUoIGhRdWV1ZSApOwotCi0gICAgLyogTnVrZSBvcnBoYW5lZCB3aW5kb3dzICovCi0KLSAgICBXSU5fRGVzdHJveVF1ZXVlV2luZG93cyggZGVza3RvcC0+Y2hpbGQsIGhRdWV1ZSApOwotCisgICAgV0lOX1Jlc2V0UXVldWVXaW5kb3dzKCBkZXNrdG9wLT5jaGlsZCwgaFF1ZXVlLCAoSFFVRVVFMTYpMCk7CiAgICAgUVVFVUVfU2V0RG9vbWVkUXVldWUoIDAgKTsKIAogICAgIC8qIEZyZWUgdGhlIG1lc3NhZ2UgcXVldWUgKi8KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyMjQ4NAotLS0gL2Rldi9udWxsCisrKyBiL21pc2Mvd2luc29jay5jCkBAIC0wLDAgKzEsMTcxMyBAQAorLyoKKyAqIGJhc2VkIG9uIFdpbmRvd3MgU29ja2V0cyAxLjEgc3BlY3MKKyAqIChmdHAubWljcm9zb2Z0LmNvbTovQWR2c3lzL3dpbnNvY2svc3BlYzExL1dJTlNPQ0suVFhUKQorICogCisgKiAoQykgMTk5MywxOTk0LDE5OTYgSm9obiBCcmV6YWssIEVyaWsgQm9zLCBBbGV4IEtvcm9ia2EuCisgKi8KKyAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZiBkZWZpbmVkKF9fc3ZyNF9fKQorI2luY2x1ZGUgPHN5cy9maWxpby5oPgorI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9tc2cuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2lubnQuaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAid2luc29jay5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBkdW1wX3NvY2thZGRyKGEpIFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrYWRkcl9pbjogZmFtaWx5ICVkLCBhZGRyZXNzICVzLCBwb3J0ICVkXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWEpLT5zaW5fZmFtaWx5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhKS0+c2luX2FkZHIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWEpLT5zaW5fcG9ydCkpCisKK2V4dGVybiB2b2lkIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEJPT0wzMiApOworCisjcHJhZ21hIHBhY2soNCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW50ZXJuYWwgZGF0YSAqLworCitleHRlcm4gaW50IGhfZXJybm87CitleHRlcm4gdm9pZCBfX3NpZ2lvKGludCk7CisKK3dzX2FzeW5jX2N0bCAgICAgICAgICAgIGFzeW5jX2N0bDsKK2ludCAgICAgICAgICAgICAgICAgICAgIGFzeW5jX3FpZCA9IC0xOworCitzdGF0aWMgSEFORExFMzIgCV9XU0hlYXAgPSAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIqCV93c19zdHViID0gTlVMTDsKK3N0YXRpYyBMUFdTSU5GTyAgICAgICAgIF93c2lfbGlzdCA9IE5VTEw7CisKKyNkZWZpbmUgV1NfQUxMT0Moc2l6ZSkgXAorCUhlYXBBbGxvYyhfV1NIZWFwLCBIRUFQX1pFUk9fTUVNT1JZLCAoc2l6ZSkgKQorI2RlZmluZSBXU19GUkVFKHB0cikgXAorCUhlYXBGcmVlKF9XU0hlYXAsIDAsIChwdHIpICkKKworI2RlZmluZSBXU19QVFIySEFORExFKHB0cikgXAorICAgICAgICAoKHNob3J0KSgoaW50KShwdHIpIC0gKGludClfd3Nfc3R1YikpCisjZGVmaW5lIFdTX0hBTkRMRTJQVFIoaGFuZGxlKSBcCisgICAgICAgICgodW5zaWduZWQpKChpbnQpX3dzX3N0dWIgKyAoaW50KWhhbmRsZSkpCisKKyNkZWZpbmUgV1NJX0NIRUNLX1JBTkdFKHB3c2ksIHB3cykgXAorCSggKCh1bnNpZ25lZCkocHdzKSA+ICh1bnNpZ25lZCkocHdzaSkpICYmIFwKKwkgICgodW5zaWduZWQpKHB3cykgPCAoKHVuc2lnbmVkKShwd3NpKSArIHNpemVvZihXU0lORk8pKSkgKQorCitzdGF0aWMgSU5UMTYgICAgICAgICBfd3Nfc29ja19vcHNbXSA9CisgICAgICAgeyBXU19TT19ERUJVRywgV1NfU09fUkVVU0VBRERSLCBXU19TT19LRUVQQUxJVkUsIFdTX1NPX0RPTlRST1VURSwKKyAgICAgICAgIFdTX1NPX0JST0FEQ0FTVCwgV1NfU09fTElOR0VSLCBXU19TT19PT0JJTkxJTkUsIFdTX1NPX1NOREJVRiwKKyAgICAgICAgIFdTX1NPX1JDVkJVRiwgV1NfU09fRVJST1IsIFdTX1NPX1RZUEUsIFdTX1NPX0RPTlRMSU5HRVIsIDAgfTsKK3N0YXRpYyBpbnQgICAgICAgICAgIF9weF9zb2NrX29wc1tdID0KKyAgICAgICB7IFNPX0RFQlVHLCBTT19SRVVTRUFERFIsIFNPX0tFRVBBTElWRSwgU09fRE9OVFJPVVRFLCBTT19CUk9BRENBU1QsCisgICAgICAgICBTT19MSU5HRVIsIFNPX09PQklOTElORSwgU09fU05EQlVGLCBTT19SQ1ZCVUYsIFNPX0VSUk9SLCBTT19UWVBFLAorCSBTT19MSU5HRVIgfTsKKworc3RhdGljIElOVDE2IGluaXRfYXN5bmNfc2VsZWN0KHdzX3NvY2tldCogcHdzLCBIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIFVJTlQzMiBsRXZlbnQpOworc3RhdGljIGludCBub3RpZnlfY2xpZW50KHdzX3NvY2tldCogcHdzLCB1bnNpZ25lZCBmbGFnKTsKKworc3RhdGljIGludCBfY2hlY2tfd3MoTFBXU0lORk8gcHdzaSwgd3Nfc29ja2V0KiBwd3MpOworc3RhdGljIGludCBfY2hlY2tfYnVmZmVyKExQV1NJTkZPIHB3c2ksIGludCBzaXplKTsKKworc3RhdGljIHZvaWQgZml4dXBfd3NoZShzdHJ1Y3Qgd3NfaG9zdGVudCogcF93c2hlLCBTRUdQVFIgYmFzZSk7CitzdGF0aWMgdm9pZCBmaXh1cF93c3BlKHN0cnVjdCB3c19wcm90b2VudCogcF93c3BlLCBTRUdQVFIgYmFzZSk7CitzdGF0aWMgdm9pZCBmaXh1cF93c3NlKHN0cnVjdCB3c19zZXJ2ZW50KiBwX3dzc2UsIFNFR1BUUiBiYXNlKTsKKworc3RhdGljIGludCBkZWxldGVfYXN5bmNfb3Aod3Nfc29ja2V0Kik7CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRfc29ja29wdChJTlQxNiAqbGV2ZWwsIElOVDE2ICpvcHRuYW1lKQoreworICBpbnQgICAgICAgICAgIGk7CisgIHN3aXRjaCAoKmxldmVsKQorICB7CisgICAgIGNhc2UgV1NfU09MX1NPQ0tFVDoKKyAgICAgICAgKmxldmVsID0gU09MX1NPQ0tFVDsKKyAgICAgICAgZm9yKGk9MDsgX3dzX3NvY2tfb3BzW2ldOyBpKyspCisgICAgICAgICAgICBpZiggX3dzX3NvY2tfb3BzW2ldID09ICpvcHRuYW1lICkgYnJlYWs7CisgICAgICAgIGlmKCBfd3Nfc29ja19vcHNbaV0gKSAqb3B0bmFtZSA9IChJTlQxNilfcHhfc29ja19vcHNbaV07CisgICAgICAgIGVsc2UgZnByaW50ZihzdGRlcnIsICJjb252ZXJ0X3NvY2tvcHQoKSB1bmtub3duIG9wdG5hbWUgJWRcbiIsICpvcHRuYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgV1NfSVBQUk9UT19UQ1A6CisgICAgICAgICpvcHRuYW1lID0gSVBQUk9UT19UQ1A7CisgIH0KK30KKworc3RhdGljIHZvaWQgX3dzX2dsb2JhbF9pbml0KCkKK3sKKyAgIGlmKCAhX3dzX3N0dWIgKQorICAgeworICAgICBfV1NIZWFwID0gSGVhcENyZWF0ZShIRUFQX1pFUk9fTUVNT1JZLCA4MTIwLCAzMjc2OCk7CisgICAgIGlmKCAhKF93c19zdHViID0gV1NfQUxMT0MoMHgxMCkpICkKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmF0YWw6IGZhaWxlZCB0byBjcmVhdGUgV2luU29jayBoZWFwXG4iKTsKKyAgIH0KKyAgIGlmKCBhc3luY19xaWQgPT0gLTEgKSAKKyAgICAgaWYoIChhc3luY19xaWQgPSBtc2dnZXQoSVBDX1BSSVZBVEUsIElQQ19DUkVBVCB8IDB4MUZGKSkgPT0gLTEgKQorICAgICAgIGZwcmludGYoc3RkZXJyLCJGYXRhbDogZmFpbGVkIHRvIGNyZWF0ZSBXaW5Tb2NrIHJlc291cmNlXG4iKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGVyLXRocmVhZCBpbmZvICovCisKK3N0YXRpYyB2b2lkIHdzaV9saW5rKExQV1NJTkZPIHB3c2kpCit7IGlmKCBfd3NpX2xpc3QgKSBfd3NpX2xpc3QtPnByZXYgPSBwd3NpOworICBwd3NpLT5uZXh0ID0gX3dzaV9saXN0OyBfd3NpX2xpc3QgPSBwd3NpOyAKK30KKworc3RhdGljIHZvaWQgd3NpX3VubGluayhMUFdTSU5GTyBwd3NpKQoreworICBpZiggcHdzaSA9PSBfd3NpX2xpc3QgKSBfd3NpX2xpc3QgPSBwd3NpLT5uZXh0OworICBlbHNlIAorICB7IHB3c2ktPnByZXYtPm5leHQgPSBwd3NpLT5uZXh0OworICAgIGlmKCBwd3NpLT5uZXh0ICkgcHdzaS0+bmV4dC0+cHJldiA9IHB3c2ktPnByZXY7IH0gCit9CisKK3N0YXRpYyBMUFdTSU5GTyB3c2lfZmluZChIVEFTSzE2IGhUYXNrKQoreyBMUFdTSU5GTyBwd3NpID0gX3dzaV9saXN0OworICB3aGlsZSggcHdzaSAmJiBwd3NpLT50aWQgIT0gaFRhc2sgKSBwd3NpID0gcHdzaS0+bmV4dDsKKyAgcmV0dXJuIHB3c2k7IAorfQorCitzdGF0aWMgd3Nfc29ja2V0KiB3c2lfYWxsb2Nfc29ja2V0KExQV1NJTkZPIHB3c2ksIGludCBmZCkKK3sKKyAgaWYoIHB3c2ktPmxhc3RfZnJlZSA+PSAwICkKKyAgeworICAgIGludCBpID0gcHdzaS0+bGFzdF9mcmVlOworCisgICAgcHdzaS0+bGFzdF9mcmVlID0gcHdzaS0+c29ja1tpXS5mbGFnczsKKyAgICBwd3NpLT5zb2NrW2ldLmZkID0gZmQ7CisgICAgcHdzaS0+c29ja1tpXS5mbGFncyA9IDA7CisgICAgcmV0dXJuICZwd3NpLT5zb2NrW2ldOworICB9CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmZF9zZXRfbm9ybWFsaXplKGZkX3NldCogZmRzLCBMUFdTSU5GTyBwd3NpLCB3c19mZF9zZXQqIHdzLCBpbnQqIGhpZ2hmZCkKK3sKKyAgRkRfWkVSTyhmZHMpOworICBpZih3cykgCisgIHsgCisgICAgaW50IAlpOworICAgIHdzX3NvY2tldCogIHB3czsKKyAgICBmb3IoaT0wO2k8KHdzLT5mZF9jb3VudCk7aSsrKSAKKyAgICB7CisgICAgICBwd3MgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHdzLT5mZF9hcnJheVtpXSk7CisgICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKSAKKyAgICAgIHsgCisgICAgICAgIGlmKCBwd3MtPmZkID4gKmhpZ2hmZCApICpoaWdoZmQgPSBwd3MtPmZkOyAKKyAgICAgICAgRkRfU0VUKHB3cy0+ZmQsIGZkcyk7IAorICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBmZF9zZXRfdXBkYXRlKExQV1NJTkZPIHB3c2ksIGZkX3NldCogZmRzLCB3c19mZF9zZXQqIHdzKQoreworICBpZiggd3MgKQorICB7CisgICAgaW50CSAgICAgICAgaSwgaiwgY291bnQgPSB3cy0+ZmRfY291bnQ7CisgICAgd3Nfc29ja2V0KiAgcHdzOworICAgIGZvciggaSA9IDAsIGogPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgcHdzID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUih3cy0+ZmRfYXJyYXlbaV0pOworICAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkgCisgICAgICAgIGlmKCBGRF9JU1NFVChwd3MtPmZkLCBmZHMpICkKKyAgICAgICAgeyAKKwkgIHdzLT5mZF9hcnJheVtqKytdID0gd3MtPmZkX2FycmF5W2ldOworICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgfQorICAgICAgd3MtPmZkX2NvdW50LS07CisgICAgfQorICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFQSSAtLS0tLSAKKyAqCisgKiBJbml0IC8gY2xlYW51cCAvIGVycm9yIGNoZWNraW5nLgorICovCisKK0lOVDE2IFdTQVN0YXJ0dXAoVUlOVDE2IHdWZXJzaW9uUmVxdWVzdGVkLCBMUFdTQURBVEEgbHBXU0FEYXRhKQoreworICBXU0FEQVRBIFdJTlNPQ0tfZGF0YSA9IHsgMHgwMTAxLCAweDAxMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJXSU5FIFNvY2tldHMgMS4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBsaW51eAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGludXgvaTM4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAjZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXRCU0QvaTM4NiIsCisgICAgICAgICAgICAgICAgICAgICAgICAjZWxpZiBkZWZpbmVkKHN1bm9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VuT1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZWVCU0QiLAorICAgICAgICAgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAorICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisJCQkgICBXU19NQVhfU09DS0VUU19QRVJfVEhSRUFELAorCQkJICAgV1NfTUFYX1VEUF9EQVRBR1JBTSwgTlVMTCB9OworICBIVEFTSzE2ICAgICAgICAgICAgICAgdGlkID0gR2V0Q3VycmVudFRhc2soKTsKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2k7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVN0YXJ0dXA6IHZlclJlcT0leFxuIiwgd1ZlcnNpb25SZXF1ZXN0ZWQpOworCisgIGlmIChMT0JZVEUod1ZlcnNpb25SZXF1ZXN0ZWQpIDwgMSB8fCAoTE9CWVRFKHdWZXJzaW9uUmVxdWVzdGVkKSA9PSAxICYmCisgICAgICBISUJZVEUod1ZlcnNpb25SZXF1ZXN0ZWQpIDwgMSkpIHJldHVybiBXU0FWRVJOT1RTVVBQT1JURUQ7CisKKyAgaWYgKCFscFdTQURhdGEpIHJldHVybiBXU0FFSU5WQUw7CisKKyAgX3dzX2dsb2JhbF9pbml0KCk7CisgIGlmKCBfV1NIZWFwID09IDAgKSByZXR1cm4gV1NBU1lTTk9UUkVBRFk7CisgIAorICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisgIGlmKCBwd3NpID09IE5VTEwgKQorICB7CisgICAgaWYoIChwd3NpID0gKExQV1NJTkZPKVdTX0FMTE9DKCBzaXplb2YoV1NJTkZPKSkpICkKKyAgICB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBwd3NpLT50aWQgPSB0aWQ7CisgICAgICBmb3IoIGkgPSAwOyBpIDwgV1NfTUFYX1NPQ0tFVFNfUEVSX1RIUkVBRDsgaSsrICkKKyAgICAgIHsgCisJcHdzaS0+c29ja1tpXS5mZCA9IC0xOyAKKwlwd3NpLT5zb2NrW2ldLmZsYWdzID0gaSArIDE7IAorICAgICAgfQorICAgICAgcHdzaS0+c29ja1tXU19NQVhfU09DS0VUU19QRVJfVEhSRUFEIC0gMV0uZmxhZ3MgPSAtMTsKKyAgICB9IAorICAgIGVsc2UgcmV0dXJuIFdTQVNZU05PVFJFQURZOworICAgIHdzaV9saW5rKHB3c2kpOworICB9IGVsc2UgcHdzaS0+bnVtX3N0YXJ0dXArKzsKKworICAvKiByZXR1cm4gd2luc29jayBpbmZvcm1hdGlvbiAqLworICBtZW1jcHkobHBXU0FEYXRhLCAmV0lOU09DS19kYXRhLCBzaXplb2YoV0lOU09DS19kYXRhKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVN0YXJ0dXA6IHN1Y2NlZWRlZFxuIik7CisgIHJldHVybigwKTsKK30KKworSU5UMTYgV1NBQ2xlYW51cCh2b2lkKQoreworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICAvKiBGSVhNRTogZG8gZ2xvYmFsIGNsZWFudXAgaWYgbm8gY3VycmVudCB0YXNrICovCisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQUNsZWFudXAoJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKKyAgaWYoIHB3c2kgKQorICB7CisgICAgICBpbnQJaSwgaiwgbjsKKworICAgICAgaWYoIHB3c2ktPm51bV9zdGFydHVwLS0gKSByZXR1cm4gMDsKKworICAgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cyggVFJVRSApOworICAgICAgV0lOU09DS19jYW5jZWxfYXN5bmNfb3AoR2V0Q3VycmVudFRhc2soKSk7CisgICAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOworCisgICAgICB3c2lfdW5saW5rKHB3c2kpOworICAgICAgaWYoIF93c2lfbGlzdCA9PSBOVUxMICYmIGFzeW5jX3FpZCAhPSAtMSApCisgICAgICAgIGlmKCBtc2djdGwoYXN5bmNfcWlkLCBJUENfUk1JRCwgTlVMTCkgPT0gLTEgKQorICAgICAgICB7IAorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJmYWlsZWQgdG8gZGVsZXRlIFdTIG1lc3NhZ2UgcXVldWUuXG4iKTsKKyAgICAgICAgfSBlbHNlIGFzeW5jX3FpZCA9IC0xOworCisgICAgICBpZiggcHdzaS0+ZmxhZ3MgJiBXU0lfQkxPQ0tJTkdDQUxMICkKKwkgIGRwcmludGZfd2luc29jayhzdGRkZWIsIlx0aW5zaWRlIGJsb2NraW5nIGNhbGwhXG4iKTsKKyAgICAgIGlmKCBwd3NpLT5udW1fYXN5bmNfcnEgKQorCSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiXHRoYXZlICVpIG91dHN0YW5kaW5nIGFzeW5jIG9wcyFcbiIsIHB3c2ktPm51bV9hc3luY19ycSApOworCisgICAgICBmb3IoaSA9IDAsIGogPSAwLCBuID0gMDsgaSA8IFdTX01BWF9TT0NLRVRTX1BFUl9USFJFQUQ7IGkrKykKKwlpZiggcHdzaS0+c29ja1tpXS5mZCAhPSAtMSApCisJeyAKKwkgIG4gKz0gZGVsZXRlX2FzeW5jX29wKCZwd3NpLT5zb2NrW2ldKTsKKyAgICAgICAgICBjbG9zZShwd3NpLT5zb2NrW2ldLmZkKTsgaisrOyAKKyAgICAgICAgfQorICAgICAgaWYoIGogKSAKKwkgIGRwcmludGZfd2luc29jayhzdGRkZWIsIlx0Y2xvc2VkICVpIHNvY2tldHMsIGtpbGxlZCAlaSBhc3luYyBzZWxlY3RzIVxuIiwgaiwgbik7CisKKyAgICAgIGlmKCBwd3NpLT5idWZmZXIgKSBTRUdQVFJfRlJFRShwd3NpLT5idWZmZXIpOworICAgICAgV1NfRlJFRShwd3NpKTsKKyAgICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK0lOVDE2IFdTQUdldExhc3RFcnJvcih2b2lkKQoreworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKyAgSU5UMTYJCXJldDsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBR2V0TGFzdEVycm9yKCUwOHgpIiwgKHVuc2lnbmVkKXB3c2kpOworCisgIHJldCA9IChwd3NpKSA/IHB3c2ktPmVycm5vIDogV1NBTk9USU5JVElBTElTRUQ7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiA9ICVpXG4iLCAoaW50KXJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgV1NBU2V0TGFzdEVycm9yKElOVDE2IGlFcnJvcikKK3sKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVNldExhc3RFcnJvciglMDh4KTogJWRcbiIsICh1bnNpZ25lZClwd3NpLCAoaW50KWlFcnJvcik7CisKKyAgaWYoIHB3c2kgKSBwd3NpLT5lcnJubyA9IGlFcnJvcjsKK30KKworaW50IF9jaGVja193cyhMUFdTSU5GTyBwd3NpLCB3c19zb2NrZXQqIHB3cykKK3sKKyAgaWYoIHB3c2kgKQorICAgIGlmKCBwd3NpLT5mbGFncyAmIFdTSV9CTE9DS0lOR0NBTEwgKSBwd3NpLT5lcnJubyA9IFdTQUVJTlBST0dSRVNTOworICAgIGVsc2UgaWYoIFdTSV9DSEVDS19SQU5HRShwd3NpLCBwd3MpICkgcmV0dXJuIDE7CisgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT1RTT0NLOworICByZXR1cm4gMDsKK30KKworaW50IF9jaGVja19idWZmZXIoTFBXU0lORk8gcHdzaSwgaW50IHNpemUpCit7CisgIGlmKCBwd3NpLT5idWZmZXIgJiYgcHdzaS0+YnVmbGVuID49IHNpemUgKSByZXR1cm4gMTsKKyAgZWxzZSBTRUdQVFJfRlJFRShwd3NpLT5idWZmZXIpOworICBwd3NpLT5idWZmZXIgPSAoY2hhciopU0VHUFRSX0FMTE9DKChwd3NpLT5idWZsZW4gPSBzaXplKSk7IAorICByZXR1cm4gKHB3c2ktPmJ1ZmZlciAhPSBOVUxMKTsKK30KKworLyogLS0tLS0gc29ja2V0IG9wZXJhdGlvbnMgKi8KKworU09DS0VUMTYgV0lOU09DS19hY2NlcHQoU09DS0VUMTYgcywgc3RydWN0IHNvY2thZGRyICphZGRyLCBJTlQxNiAqYWRkcmxlbjE2KQoreworICB3c19zb2NrZXQqCXB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOworICBMUFdTSU5GTwlwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FDQ0VQVCglMDh4KTogc29ja2V0ICUwNHhcbiIsIAorCQkJCSAgICh1bnNpZ25lZClwd3NpLCAoVUlOVDE2KXMpOyAKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgICBpbnQgCXNvY2ssIGZkX2ZsYWdzLCBhZGRybGVuMzIgPSAqYWRkcmxlbjE2OworCisgICAgIC8qIHRoaXMgaXMgaG93IGJsb2NrIGluZm8gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCAtCisgICAgICAqIFdTQUlzQmxvY2tpbmcoKSB3b3VsZCB0aGVuIGNoZWNrIFdTSV9CTE9DS0lOR0NBTEwgYml0LgorICAgICAgKi8KKworICAgICBmZF9mbGFncyA9IGZjbnRsKHB3cy0+ZmQsIEZfR0VURkwsIDApOworICAgICBpZiggIShmZF9mbGFncyAmIE9fTk9OQkxPQ0spICkgcHdzaS0+ZmxhZ3MgfD0gV1NJX0JMT0NLSU5HQ0FMTDsgCisKKyAgICAgaWYoIChzb2NrID0gYWNjZXB0KHB3cy0+ZmQsIGFkZHIsICZhZGRybGVuMzIpKSA+PSAwICkKKyAgICAgeworICAgICAgICB3c19zb2NrZXQqCXBuZXcgPSB3c2lfYWxsb2Nfc29ja2V0KHB3c2ksIHNvY2spOyAKKwlub3RpZnlfY2xpZW50KHB3cywgV1NfRkRfQUNDRVBUKTsKKyAgICAgICAgaWYoIHBuZXcgKQorICAgICAgICB7CisJICBpZiggcHdzLT5wX2FvcCApCisJICAgICAgaW5pdF9hc3luY19zZWxlY3QocG5ldywgcHdzLT5wX2FvcC0+aFduZCwKKwkJCQkgICAgICBwd3MtPnBfYW9wLT51TXNnLAorCQkJCSAgICAgIHB3cy0+cF9hb3AtPmZsYWdzICYgfldTX0ZEX0FDQ0VQVCApOworCisJICBwd3NpLT5mbGFncyAmPSB+V1NJX0JMT0NLSU5HQ0FMTDsgCisJICByZXR1cm4gKFNPQ0tFVDE2KVdTX1BUUjJIQU5ETEUocG5ldyk7CisgICAgICAgIH0gCisJZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisgICAgIH0gCisgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworCisgICAgIHB3c2ktPmZsYWdzICY9IH5XU0lfQkxPQ0tJTkdDQUxMOworICB9CisgIHJldHVybiBJTlZBTElEX1NPQ0tFVDsKK30KKworSU5UMTYgV0lOU09DS19iaW5kKFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UMTYgbmFtZWxlbikKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0JJTkQoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTh4LCBsZW5ndGggJWRcbiIsIAorCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsIChpbnQpIG5hbWUsIG5hbWVsZW4pOworI2lmIDAKKyAgZHVtcF9zb2NrYWRkcihuYW1lKTsKKyNlbmRpZgorCisgIGlmICggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICAgIGlmIChuYW1lbGVuID49IHNpemVvZigqbmFtZSkpIAorICAgICAgIGlmICggKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKiluYW1lKS0+c2luX2ZhbWlseSA9PSBBRl9JTkVUICkKKwkgIGlmICggYmluZChwd3MtPmZkLCBuYW1lLCBuYW1lbGVuKSA8IDAgKSAKKwkgIHsKKwkgICAgIGludAlsb2NfZXJybm8gPSBlcnJubzsKKwkgICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsIlx0ZmFpbHVyZSAtIGVycm5vID0gJWlcbiIsIGVycm5vKTsKKwkgICAgIGVycm5vID0gbG9jX2Vycm5vOworCSAgICAgc3dpdGNoKGVycm5vKQorCSAgICAgeworCQljYXNlIEVCQURGOiBwd3NpLT5lcnJubyA9IFdTQUVOT1RTT0NLOyBicmVhazsKKwkJY2FzZSBFQUREUk5PVEFWQUlMOiBwd3NpLT5lcnJubyA9IFdTQUVJTlZBTDsgYnJlYWs7CisJCWRlZmF1bHQ6IHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKwkgICAgIH0KKwkgIH0KKwkgIGVsc2UgcmV0dXJuIDA7CisgICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVBRk5PU1VQUE9SVDsKKyAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRUZBVUxUOworICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX2Nsb3Nlc29ja2V0KFNPQ0tFVDE2IHMpCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19DTE9TRSglMDh4KTogc29ja2V0ICUwOHhcbiIsICh1bnNpZ25lZClwd3NpLCBzKTsKKworICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICB7IAorICAgIGludAkJZmQgPSBwd3MtPmZkOworCisgICAgZGVsZXRlX2FzeW5jX29wKHB3cyk7CisgICAgcHdzLT5wX2FvcCA9IE5VTEw7IHB3cy0+ZmQgPSAtMTsKKyAgICBwd3MtPmZsYWdzID0gKHVuc2lnbmVkKXB3c2ktPmxhc3RfZnJlZTsKKyAgICBwd3NpLT5sYXN0X2ZyZWUgPSBwd3MgLSAmcHdzaS0+c29ja1swXTsKKyAgICBpZiAoY2xvc2UoZmQpIDwgMCkgcHdzaS0+ZXJybm8gPSAoZXJybm8gPT0gRUJBREYpID8gV1NBRU5PVFNPQ0sgOiB3c2FFcnJubygpOworICAgIGVsc2UgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworSU5UMTYgV0lOU09DS19jb25uZWN0KFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UMTYgbmFtZWxlbikKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0NPTk5FQ1QoJTA4eCk6IHNvY2tldCAlMDR4LCBwdHIgJTh4LCBsZW5ndGggJWRcbiIsIAorCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsIChpbnQpIG5hbWUsIG5hbWVsZW4pOworI2lmIDAKKyAgZHVtcF9zb2NrYWRkcihuYW1lKTsKKyNlbmRpZgorCisgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCisgIHsKKyAgICBpZiAoY29ubmVjdChwd3MtPmZkLCBuYW1lLCBuYW1lbGVuKSA9PSAwKSAKKyAgICB7IAorCWlmKCBwd3MtPnBfYW9wICkKKwkgICAgLyogd2UgbmVlZCB0byBub3RpZnkgaGFuZGxlciBwcm9jZXNzIGlmCisJICAgICAqIGNvbm5lY3QoKSBzdWNjZWVkZWQgTk9UIGluIHJlc3BvbnNlIHRvIHdpbnNvY2sgbWVzc2FnZQorCSAgICAgKi8KKwkgICAgbm90aWZ5X2NsaWVudChwd3MsIFdTX0ZEX0NPTk5FQ1RFRCk7CisKKyAgICAgICAgcHdzLT5mbGFncyAmPSB+KFdTX0ZEX0lOQUNUSVZFIHwgV1NfRkRfQ09OTkVDVCk7IAorICAgICAgICByZXR1cm4gMDsgCisgICAgfQorICAgIHB3c2ktPmVycm5vID0gKGVycm5vID09IEVJTlBST0dSRVNTKSA/IFdTQUVXT1VMREJMT0NLIDogd3NhRXJybm8oKTsKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX2dldHBlZXJuYW1lKFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UMTYgKm5hbWVsZW4pCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HRVRQRUVSTkFNRSglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKKwkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCAqbmFtZWxlbik7CisgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCisgIHsKKyAgICBpbnQJbmFtZWxlbjMyID0gKm5hbWVsZW47CisgICAgaWYgKGdldHBlZXJuYW1lKHB3cy0+ZmQsIG5hbWUsICZuYW1lbGVuMzIpID09IDApIAorICAgIHsgCisjaWYgMAorCWR1bXBfc29ja2FkZHIobmFtZSk7CisjZW5kaWYKKyAgICAgICAqbmFtZWxlbiA9IChJTlQxNiluYW1lbGVuMzI7IAorICAgICAgICByZXR1cm4gMDsgCisgICAgfQorICAgIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX2dldHNvY2tuYW1lKFNPQ0tFVDE2IHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UMTYgKm5hbWVsZW4pCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HRVRTT0NLTkFNRSglMDh4KTogc29ja2V0OiAlMDR4LCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKKwkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIChpbnQpIG5hbWUsIChpbnQpICpuYW1lbGVuKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIGludCBuYW1lbGVuMzIgPSAqbmFtZWxlbjsKKyAgICBpZiAoZ2V0c29ja25hbWUocHdzLT5mZCwgbmFtZSwgJm5hbWVsZW4zMikgPT0gMCkKKyAgICB7IAorCSpuYW1lbGVuID0gKElOVDE2KW5hbWVsZW4zMjsgCisJIHJldHVybiAwOyAKKyAgICB9CisgICAgcHdzaS0+ZXJybm8gPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworICB9CisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK0lOVDE2IFdJTlNPQ0tfZ2V0c29ja29wdChTT0NLRVQxNiBzLCBJTlQxNiBsZXZlbCwgCisJCQkgSU5UMTYgb3B0bmFtZSwgY2hhciAqb3B0dmFsLCBJTlQxNiAqb3B0bGVuKQoreworICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX0dFVFNPQ0tPUFQoJTA4eCk6IHNvY2tldDogJTA0eCwgb3B0ICVkLCBwdHIgJTh4LCBwdHIgJTh4XG4iLCAKKwkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCBsZXZlbCwgKGludCkgb3B0dmFsLCAoaW50KSAqb3B0bGVuKTsKKworICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICB7CisgICAgIGludAlvcHRsZW4zMiA9ICpvcHRsZW47CisKKyAgICAgY29udmVydF9zb2Nrb3B0KCZsZXZlbCwgJm9wdG5hbWUpOworICAgICBpZiAoZ2V0c29ja29wdChwd3MtPmZkLCAoaW50KSBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCAmb3B0bGVuMzIpID09IDAgKQorICAgICB7ICpvcHRsZW4gPSAoSU5UMTYpb3B0bGVuMzI7IHJldHVybiAwOyB9CisgICAgIHB3c2ktPmVycm5vID0gKGVycm5vID09IEVCQURGKSA/IFdTQUVOT1RTT0NLIDogd3NhRXJybm8oKTsKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCit1X2xvbmcgIFdJTlNPQ0tfaHRvbmwodV9sb25nIGhvc3Rsb25nKSAgIHsgcmV0dXJuKCBodG9ubChob3N0bG9uZykgKTsgfSAgICAgICAgIAordV9zaG9ydCBXSU5TT0NLX2h0b25zKHVfc2hvcnQgaG9zdHNob3J0KSB7IHJldHVybiggaHRvbnMoaG9zdHNob3J0KSApOyB9Cit1X2xvbmcgIFdJTlNPQ0tfaW5ldF9hZGRyKGNoYXIgKmNwKSAgICAgIHsgcmV0dXJuKCBpbmV0X2FkZHIoY3ApICk7IH0KK3VfbG9uZyAgV0lOU09DS19udG9obCh1X2xvbmcgbmV0bG9uZykgICAgeyByZXR1cm4oIG50b2hsKG5ldGxvbmcpICk7IH0KK3Vfc2hvcnQgV0lOU09DS19udG9ocyh1X3Nob3J0IG5ldHNob3J0KSAgeyByZXR1cm4oIG50b2hzKG5ldHNob3J0KSApOyB9CisKK1NFR1BUUiBXSU5TT0NLX2luZXRfbnRvYShzdHJ1Y3QgaW5fYWRkciBpbikKK3sKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisgIGNoYXIqCQlzID0gaW5ldF9udG9hKGluKTsKKworICBpZiggcHdzaSApCisgIHsKKyAgICBpZiggcyA9PSBOVUxMICkgeyBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7IHJldHVybiBOVUxMOyB9CisgICAgaWYoIF9jaGVja19idWZmZXIoIHB3c2ksIDMyICkgKQorICAgIHsgCisgICAgICBzdHJuY3B5KHB3c2ktPmJ1ZmZlciwgcywgMzIgKTsKKyAgICAgIHJldHVybiBTRUdQVFJfR0VUKHB3c2ktPmJ1ZmZlcik7IAorICAgIH0KKyAgICBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisgIH0KKyAgcmV0dXJuIChTRUdQVFIpTlVMTDsKK30KKworSU5UMTYgV0lOU09DS19pb2N0bHNvY2tldChTT0NLRVQxNiBzLCBVSU5UMzIgY21kLCBVSU5UMzIgKmFyZ3ApCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19JT0NUTCglMDh4KTogc29ja2V0ICUwNHgsIGNtZCAlMDh4LCBwdHIgJTh4XG4iLCAKKwkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIGNtZCwgKHVuc2lnbmVkKSBhcmdwKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIGxvbmcgCW5ld2NtZCAgPSBjbWQ7CisKKyAgICBzd2l0Y2goIGNtZCApCisgICAgeworCWNhc2UgV1NfRklPTlJFQUQ6ICAgbmV3Y21kPUZJT05SRUFEOyBicmVhazsKKwljYXNlIFdTX0ZJT05CSU86ICAgIG5ld2NtZD1GSU9OQklPOyAgCisJCQkgICAgaWYoIHB3cy0+cF9hb3AgJiYgKmFyZ3AgPT0gMCApIAorCQkJICAgIHsgCisJCQkJcHdzaS0+ZXJybm8gPSBXU0FFSU5WQUw7IAorCQkJCXJldHVybiBTT0NLRVRfRVJST1I7IAorCQkJICAgIH0KKwkJCSAgICBicmVhazsKKwljYXNlIFdTX1NJT0NBVE1BUks6IG5ld2NtZD1TSU9DQVRNQVJLOyBicmVhazsKKwljYXNlIFdTX0lPVygnZicsMTI1LHVfbG9uZyk6IAorCQkJICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogV1MxLjEgc2hvdWxkbid0IGJlIHVzaW5nIGFzeW5jIEkvT1xuIik7CisJCQkgIHB3c2ktPmVycm5vID0gV1NBRUlOVkFMOyByZXR1cm4gU09DS0VUX0VSUk9SOworCWRlZmF1bHQ6CSAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IFVua25vd24gV1NfSU9DVEwgY21kICglMDh4KVxuIiwgY21kKTsKKyAgICB9CisgICAgaWYoIGlvY3RsKHB3cy0+ZmQsIG5ld2NtZCwgKGNoYXIqKWFyZ3AgKSA9PSAwICkgcmV0dXJuIDA7CisgICAgcHdzaS0+ZXJybm8gPSAoZXJybm8gPT0gRUJBREYpID8gV1NBRU5PVFNPQ0sgOiB3c2FFcnJubygpOyAKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX2xpc3RlbihTT0NLRVQxNiBzLCBJTlQxNiBiYWNrbG9nKQoreworICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfTElTVEVOKCUwOHgpOiBzb2NrZXQgJTA0eCwgYmFja2xvZyAlZFxuIiwgCisJCQkgICh1bnNpZ25lZClwd3NpLCBzLCBiYWNrbG9nKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIGlmKCAhcHdzLT5wX2FvcCApCisgICAgeworICAgICAgaW50ICBmZF9mbGFncyA9IGZjbnRsKHB3cy0+ZmQsIEZfR0VURkwsIDApOworICAgICAgaWYoICEoZmRfZmxhZ3MgJiBPX05PTkJMT0NLKSApIHB3cy0+ZmxhZ3MgfD0gV1NfRkRfQUNDRVBUOworICAgIH0KKyAgICBlbHNlIG5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9BQ0NFUFQpOworCisgICAgaWYgKGxpc3Rlbihwd3MtPmZkLCBiYWNrbG9nKSA9PSAwKSByZXR1cm4gMDsKKyAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworSU5UMTYgV0lOU09DS19yZWN2KFNPQ0tFVDE2IHMsIGNoYXIgKmJ1ZiwgSU5UMTYgbGVuLCBJTlQxNiBmbGFncykKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1JFQ1YoJTA4eCk6IHNvY2tldCAlMDR4LCBidWYgJTh4LCBsZW4gJWQsIGZsYWdzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZClidWYsIGxlbiwgZmxhZ3MpOworICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICB7CisgICAgaW50IGxlbmd0aDsKKyAgICBpZiAoKGxlbmd0aCA9IHJlY3YocHdzLT5mZCwgYnVmLCBsZW4sIGZsYWdzKSkgPj0gMCkgCisgICAgeyAKKwlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiIC0+ICVpIGJ5dGVzXG4iLCBsZW5ndGgpOworCW5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9SRUFEKTsKKwlyZXR1cm4gKElOVDE2KWxlbmd0aDsKKyAgICB9CisgICAgcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICB9CisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICIgLT4gRVJST1JcbiIpOworICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX3JlY3Zmcm9tKFNPQ0tFVDE2IHMsIGNoYXIgKmJ1ZiwgSU5UMTYgbGVuLCBJTlQxNiBmbGFncywgCisJCXN0cnVjdCBzb2NrYWRkciAqZnJvbSwgSU5UMTYgKmZyb21sZW4xNikKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1JFQ1ZGUk9NKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsIGxlbiAlZCwgZmxhZ3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpYnVmLCBsZW4sIGZsYWdzKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIGludCBsZW5ndGgsIGZyb21sZW4zMiA9ICpmcm9tbGVuMTY7CisgICAgaWYgKChsZW5ndGggPSByZWN2ZnJvbShwd3MtPmZkLCBidWYsIGxlbiwgZmxhZ3MsIGZyb20sICZmcm9tbGVuMzIpKSA+PSAwKSAKKyAgICB7ICAgCisgICAgICAqZnJvbWxlbjE2ID0gZnJvbWxlbjMyOyAKKyAgICAgICBub3RpZnlfY2xpZW50KHB3cywgV1NfRkRfUkVBRCk7CisgICAgICAgcmV0dXJuIChJTlQxNilsZW5ndGg7CisgICAgfQorICAgIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCitJTlQxNiBXSU5TT0NLX3NlbGVjdChJTlQxNiBuZmRzLCB3c19mZF9zZXQgKndzX3JlYWRmZHMsCisJCQkJIHdzX2ZkX3NldCAqd3Nfd3JpdGVmZHMsCisJCQkJIHdzX2ZkX3NldCAqd3NfZXhjZXB0ZmRzLCBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisJCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TRUxFQ1QoJTA4eCk6IG5mZHMgJWQgKGlnbm9yZWQpLCByZWFkICU4eCwgd3JpdGUgJTh4LCBleGNwICU4eFxuIiwgCisJICAodW5zaWduZWQpIHB3c2ksIG5mZHMsICh1bnNpZ25lZCkgd3NfcmVhZGZkcywgKHVuc2lnbmVkKSB3c193cml0ZWZkcywgKHVuc2lnbmVkKSB3c19leGNlcHRmZHMpOworCisgIGlmKCBwd3NpICkKKyAgeworICAgICBpbnQgICAgICAgICBoaWdoZmQgPSAwOworICAgICBmZF9zZXQgICAgICByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzOworCisgICAgIGZkX3NldF9ub3JtYWxpemUoJnJlYWRmZHMsIHB3c2ksIHdzX3JlYWRmZHMsICZoaWdoZmQpOworICAgICBmZF9zZXRfbm9ybWFsaXplKCZ3cml0ZWZkcywgcHdzaSwgd3Nfd3JpdGVmZHMsICZoaWdoZmQpOworICAgICBmZF9zZXRfbm9ybWFsaXplKCZleGNlcHRmZHMsIHB3c2ksIHdzX2V4Y2VwdGZkcywgJmhpZ2hmZCk7CisKKyAgICAgaWYoIChoaWdoZmQgPSBzZWxlY3QoaGlnaGZkICsgMSwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgdGltZW91dCkpID49IDAgKQorICAgICB7CisJICBpZiggaGlnaGZkICkKKwkgIHsKKwkgICAgZmRfc2V0X3VwZGF0ZShwd3NpLCAmcmVhZGZkcywgd3NfcmVhZGZkcyk7CisJICAgIGZkX3NldF91cGRhdGUocHdzaSwgJndyaXRlZmRzLCB3c193cml0ZWZkcyk7CisgCSAgICBmZF9zZXRfdXBkYXRlKHB3c2ksICZleGNlcHRmZHMsIHdzX2V4Y2VwdGZkcyk7CisJICB9CisJICByZXR1cm4gaGlnaGZkOyAKKyAgICAgfQorICAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgIH0gCisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK0lOVDE2IFdJTlNPQ0tfc2VuZChTT0NLRVQxNiBzLCBjaGFyICpidWYsIElOVDE2IGxlbiwgSU5UMTYgZmxhZ3MpCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TRU5EKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsIAorCQkJICAodW5zaWduZWQpcHdzaSwgcywgKHVuc2lnbmVkKSBidWYsIGxlbiwgZmxhZ3MpOworICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICB7CisgICAgaW50CQlsZW5ndGg7CisgICAgaWYgKChsZW5ndGggPSBzZW5kKHB3cy0+ZmQsIGJ1ZiwgbGVuLCBmbGFncykpIDwgMCApIAorICAgIHsgIAorCWxlbmd0aCA9IFNPQ0tFVF9FUlJPUjsKKwlwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgICAgfQorICAgIG5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9XUklURSk7CisgICAgcmV0dXJuIChJTlQxNilsZW5ndGg7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworSU5UMTYgV0lOU09DS19zZW5kdG8oU09DS0VUMTYgcywgY2hhciAqYnVmLCBJTlQxNiBsZW4sIElOVDE2IGZsYWdzLAorCQkgICAgIHN0cnVjdCBzb2NrYWRkciAqdG8sIElOVDE2IHRvbGVuKQoreworICB3c19zb2NrZXQqICAgIHB3cyAgPSAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHMpOworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU0VORFRPKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBzLCAodW5zaWduZWQpIGJ1ZiwgbGVuLCBmbGFncyk7CisgIGlmKCBfY2hlY2tfd3MocHdzaSwgcHdzKSApCisgIHsKKyAgICBpbnQJCWxlbmd0aDsKKworICAgIGlmICgobGVuZ3RoID0gc2VuZHRvKHB3cy0+ZmQsIGJ1ZiwgbGVuLCBmbGFncywgdG8sIHRvbGVuKSkgPCAwICkKKyAgICB7CisJbGVuZ3RoID0gU09DS0VUX0VSUk9SOworICAgICAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgICAgfQorICAgIG5vdGlmeV9jbGllbnQocHdzLCBXU19GRF9XUklURSk7CisgICAgcmV0dXJuIChJTlQxNilsZW5ndGg7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworSU5UMTYgV0lOU09DS19zZXRzb2Nrb3B0KFNPQ0tFVDE2IHMsIElOVDE2IGxldmVsLCBJTlQxNiBvcHRuYW1lLCAKKwkJCSBjaGFyICpvcHR2YWwsIElOVDE2IG9wdGxlbikKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NFVFNPQ0tPUFQoJTA4eCk6IHNvY2tldCAlMDR4LCBsZXZlbCAlZCwgb3B0ICVkLCBwdHIgJTA4eCwgbGVuICVkXG4iLAorCQkJICAodW5zaWduZWQpcHdzaSwgcywgbGV2ZWwsIG9wdG5hbWUsIChpbnQpIG9wdHZhbCwgb3B0bGVuKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIGludAkJbGluZ2VyMzJbMl07CisgICAgY29udmVydF9zb2Nrb3B0KCZsZXZlbCwgJm9wdG5hbWUpOworICAgIGlmKCBvcHRuYW1lID09IFNPX0xJTkdFUiApCisgICAgeworCUlOVDE2KgkgICBwdHIgPSAoSU5UMTYqKW9wdHZhbDsKKyAgICAgICAgbGluZ2VyMzJbMF0gPSBwdHJbMF07CisJbGluZ2VyMzJbMV0gPSBwdHJbMV07IAorCW9wdHZhbCA9IChjaGFyKikmbGluZ2VyMzI7CisJb3B0bGVuID0gc2l6ZW9mKGxpbmdlcjMyKTsKKyAgICB9CisgICAgaWYgKHNldHNvY2tvcHQocHdzLT5mZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSA9PSAwKSByZXR1cm4gMDsKKyAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworSU5UMTYgV0lOU09DS19zaHV0ZG93bihTT0NLRVQxNiBzLCBJTlQxNiBob3cpCit7CisgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CisgIExQV1NJTkZPICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TSFVURE9XTiglMDh4KTogc29ja2V0ICUwNHgsIGhvdyAlaVxuIiwKKwkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCBob3cgKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgeworICAgIHB3cy0+ZmxhZ3MgID0gV1NfRkRfSU5BQ1RJVkU7CisgICAgZGVsZXRlX2FzeW5jX29wKHB3cyk7CisKKyAgICBpZiAoc2h1dGRvd24ocHdzLT5mZCwgaG93KSA9PSAwKSByZXR1cm4gMDsKKyAgICBwd3NpLT5lcnJubyA9IHdzYUVycm5vKCk7CisgIH0KKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKK30KKworU09DS0VUMTYgV0lOU09DS19zb2NrZXQoSU5UMTYgYWYsIElOVDE2IHR5cGUsIElOVDE2IHByb3RvY29sKQoreworICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfU09DS0VUKCUwOHgpOiBhZj0lZCB0eXBlPSVkIHByb3RvY29sPSVkXG4iLCAKKwkJCSAgKHVuc2lnbmVkKXB3c2ksIGFmLCB0eXBlLCBwcm90b2NvbCk7CisKKyAgaWYoIHB3c2kgKQorICB7CisgICAgaW50CQlzb2NrOworCisgICAgLyogY2hlY2sgdGhlIHNvY2tldCBmYW1pbHkgKi8KKyAgICBzd2l0Y2goYWYpIAorICAgIHsKKwljYXNlIEFGX0lORVQ6CisJY2FzZSBBRl9VTlNQRUM6IGJyZWFrOworCWRlZmF1bHQ6ICAgICAgICBwd3NpLT5lcnJubyA9IFdTQUVBRk5PU1VQUE9SVDsgcmV0dXJuIElOVkFMSURfU09DS0VUOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoZSBzb2NrZXQgdHlwZSAqLworICAgIHN3aXRjaCh0eXBlKSAKKyAgICB7CisJY2FzZSBTT0NLX1NUUkVBTToKKwljYXNlIFNPQ0tfREdSQU06CisJY2FzZSBTT0NLX1JBVzogYnJlYWs7CisJZGVmYXVsdDogICAgICAgcHdzaS0+ZXJybm8gPSBXU0FFU09DS1ROT1NVUFBPUlQ7IHJldHVybiBJTlZBTElEX1NPQ0tFVDsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgcHJvdG9jb2wgdHlwZSAqLworICAgIGlmICggcHJvdG9jb2wgPCAwICkgIC8qIGRvbid0IHN1cHBvcnQgbmVnYXRpdmUgdmFsdWVzICovCisgICAgeyBwd3NpLT5lcnJubyA9IFdTQUVQUk9UT05PU1VQUE9SVDsgcmV0dXJuIElOVkFMSURfU09DS0VUOyB9CisKKyAgICBpZiAoIGFmID09IEFGX1VOU1BFQykgIC8qIGRpZCB0aGV5IG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIGZhbWlseT8gKi8KKyAgICAgICAgc3dpdGNoKHByb3RvY29sKSAKKwl7CisgICAgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX1NUUkVBTSkgeyBhZiA9IEFGX0lORVQ7IGJyZWFrOyB9CisgICAgICAgICAgY2FzZSBJUFBST1RPX1VEUDoKKyAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX0RHUkFNKSAgeyBhZiA9IEFGX0lORVQ7IGJyZWFrOyB9CisgICAgICAgICAgZGVmYXVsdDogcHdzaS0+ZXJybm8gPSBXU0FFUFJPVE9UWVBFOyByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7CisgICAgICAgIH0KKworICAgIGlmICgoc29jayA9IHNvY2tldChhZiwgdHlwZSwgcHJvdG9jb2wpKSA+PSAwKSAKKyAgICB7CisgICAgICAgIHdzX3NvY2tldCogICAgICBwbmV3ID0gd3NpX2FsbG9jX3NvY2tldChwd3NpLCBzb2NrKTsKKworLyoJcHJpbnRmKCJjcmVhdGVkICUwNHggKCVpKVxuIiwgc29jaywgKFVJTlQxNilXU19QVFIySEFORExFKHBuZXcpKTsKKyAqLworICAgICAgICBpZiggcG5ldyApIHJldHVybiAoU09DS0VUMTYpV1NfUFRSMkhBTkRMRShwbmV3KTsKKyAgICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisgICAgfQorCisgICAgaWYgKGVycm5vID09IEVQRVJNKSAvKiByYXcgc29ja2V0IGRlbmllZCAqLworICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXU19TT0NLRVQ6IG5vdCBlbm91Z2ggcHJpdmlsZWdlc1xuIik7CisgICAgICAgIHB3c2ktPmVycm5vID0gV1NBRVNPQ0tUTk9TVVBQT1JUOworICAgIH0gcHdzaS0+ZXJybm8gPSB3c2FFcnJubygpOworICB9CisgCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJcdFx0ZmFpbGVkIVxuIik7CisgIHJldHVybiBJTlZBTElEX1NPQ0tFVDsKK30KKyAgICAKKworLyogLS0tLS0gZGF0YWJhc2UgZnVuY3Rpb25zIAorICoKKyAqIE5vdGUgdGhhdCB3c18uLi5lbnQgc3RydWN0dXJlcyB3ZSByZXR1cm4gaGF2ZSBTRUdQVFIgcG9pbnRlcnMgaW5zaWRlIHRoZW0uCisgKi8KKworc3RhdGljIGNoYXIqCU5VTExfU1RSSU5HID0gIk5VTEwiOworCisvKgorc3RydWN0IFdJTl9ob3N0ZW50ICoKKyovCitTRUdQVFIgV0lOU09DS19nZXRob3N0YnlhZGRyKGNvbnN0IGNoYXIgKmFkZHIsIElOVDE2IGxlbiwgSU5UMTYgdHlwZSkKK3sKKyAgTFBXU0lORk8gICAgICAJcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRIb3N0QnlBZGRyKCUwOHgpOiBwdHIgJTh4LCBsZW4gJWQsIHR5cGUgJWRcbiIsIAorCQkJICAodW5zaWduZWQpcHdzaSwgKHVuc2lnbmVkKSBhZGRyLCBsZW4sIHR5cGUpOworICBpZiggcHdzaSApCisgIHsKKyAgICBzdHJ1Y3QgaG9zdGVudCogCWhvc3Q7CisgICAgaWYoIChob3N0ID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIHR5cGUpKSAhPSBOVUxMICkKKyAgICAgIGlmKCBXU19kdXBfaGUocHdzaSwgaG9zdCwgV1NfRFVQX1NFR1BUUikgKQorICAgICAgICAgIHJldHVybiBTRUdQVFJfR0VUKHB3c2ktPmJ1ZmZlcik7CisgICAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKKyAgICBlbHNlIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgfSAKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCitzdHJ1Y3QgV0lOX2hvc3RlbnQgKgorKi8KK1NFR1BUUiBXSU5TT0NLX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0SG9zdEJ5TmFtZSglMDh4KTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCAobmFtZSk/bmFtZToiTlVMTCIpOworICBpZiggcHdzaSApCisgIHsKKyAgICBzdHJ1Y3QgaG9zdGVudCogICAgIGhvc3Q7CisgICAgaWYoIChob3N0ID0gZ2V0aG9zdGJ5bmFtZShuYW1lKSkgIT0gTlVMTCApCisgICAgICBpZiggV1NfZHVwX2hlKHB3c2ksIGhvc3QsIFdTX0RVUF9TRUdQVFIpICkKKyAgICAgICAgICByZXR1cm4gU0VHUFRSX0dFVChwd3NpLT5idWZmZXIpOworICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisgICAgZWxzZSBwd3NpLT5lcnJubyA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0lOVDE2IFdJTlNPQ0tfZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgSU5UMTYgbmFtZWxlbikKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0SG9zdE5hbWUoJTA4eCk6IG5hbWUgJXMsIGxlbiAlZFxuIiwgCisJCQkgICh1bnNpZ25lZClwd3NpLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgbmFtZWxlbik7CisgIGlmKCBwd3NpICkKKyAgeworICAgIGlmIChnZXRob3N0bmFtZShuYW1lLCBuYW1lbGVuKSA9PSAwKSByZXR1cm4gMDsKKyAgICBwd3NpLT5lcnJubyA9IChlcnJubyA9PSBFSU5WQUwpID8gV1NBRUZBVUxUIDogd3NhRXJybm8oKTsKKyAgfQorICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCisvKgorc3RydWN0IFdJTl9wcm90b2VudCAqCisqLworU0VHUFRSIFdJTlNPQ0tfZ2V0cHJvdG9ieW5hbWUoY2hhciAqbmFtZSkKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfR2V0UHJvdG9CeU5hbWUoJTA4eCk6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcpOworICBpZiggcHdzaSApCisgIHsKKyAgICBzdHJ1Y3QgcHJvdG9lbnQqICAgICBwcm90bzsKKyAgICBpZiggKHByb3RvID0gZ2V0cHJvdG9ieW5hbWUobmFtZSkpICE9IE5VTEwgKQorICAgICAgaWYoIFdTX2R1cF9wZShwd3NpLCBwcm90bywgV1NfRFVQX1NFR1BUUikgKQorICAgICAgICAgIHJldHVybiBTRUdQVFJfR0VUKHB3c2ktPmJ1ZmZlcik7CisgICAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKKyAgICBlbHNlIHB3c2ktPmVycm5vID0gKGhfZXJybm8gPCAwKSA/IHdzYUVycm5vKCkgOiB3c2FIZXJybm8oKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworLyoKK3N0cnVjdCBXSU5fcHJvdG9lbnQgKgorKi8KK1NFR1BUUiBXSU5TT0NLX2dldHByb3RvYnludW1iZXIoSU5UMTYgbnVtYmVyKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRQcm90b0J5TnVtYmVyKCUwOHgpOiAlaVxuIiwgKHVuc2lnbmVkKXB3c2ksIG51bWJlcik7CisKKyAgaWYoIHB3c2kgKQorICB7CisgICAgc3RydWN0IHByb3RvZW50KiAgICAgcHJvdG87CisgICAgaWYoIChwcm90byA9IGdldHByb3RvYnludW1iZXIobnVtYmVyKSkgIT0gTlVMTCApCisgICAgICBpZiggV1NfZHVwX3BlKHB3c2ksIHByb3RvLCBXU19EVVBfU0VHUFRSKSApCisgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKKyAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FOT19EQVRBOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKgorc3RydWN0IFdJTl9zZXJ2ZW50ICoKKyovCitTRUdQVFIgV0lOU09DS19nZXRzZXJ2YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByb3RvKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRTZXJ2QnlOYW1lKCUwOHgpOiAnJXMnLCAnJXMnXG4iLCAKKwkJCSAgKHVuc2lnbmVkKXB3c2ksIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HKTsKKworICBpZiggcHdzaSApCisgIHsKKyAgICBzdHJ1Y3Qgc2VydmVudCogICAgIHNlcnY7CisgICAgaWYoIChzZXJ2ID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90bykpICE9IE5VTEwgKQorICAgICAgaWYoIFdTX2R1cF9zZShwd3NpLCBzZXJ2LCBXU19EVVBfU0VHUFRSKSApCisgICAgICAgICAgcmV0dXJuIFNFR1BUUl9HRVQocHdzaS0+YnVmZmVyKTsKKyAgICAgIGVsc2UgcHdzaS0+ZXJybm8gPSBXU0FFTk9CVUZTOworICAgIGVsc2UgcHdzaS0+ZXJybm8gPSAoaF9lcnJubyA8IDApID8gd3NhRXJybm8oKSA6IHdzYUhlcnJubygpOworICB9CisgIHJldHVybiBOVUxMOworfQorCisvKgorc3RydWN0IFdJTl9zZXJ2ZW50ICoKKyovCitTRUdQVFIgV0lOU09DS19nZXRzZXJ2Ynlwb3J0KElOVDE2IHBvcnQsIGNvbnN0IGNoYXIgKnByb3RvKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19HZXRTZXJ2QnlQb3J0KCUwOHgpOiAlaSwgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChpbnQpcG9ydCwgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyk7CisgIGlmKCBwd3NpICkKKyAgeworICAgIHN0cnVjdCBzZXJ2ZW50KiAgICAgc2VydjsKKyAgICBpZiggKHNlcnYgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvKSkgIT0gTlVMTCApCisgICAgICBpZiggV1NfZHVwX3NlKHB3c2ksIHNlcnYsIFdTX0RVUF9TRUdQVFIpICkKKyAgICAgICAgICByZXR1cm4gU0VHUFRSX0dFVChwd3NpLT5idWZmZXIpOworICAgICAgZWxzZSBwd3NpLT5lcnJubyA9IFdTQUVOT0JVRlM7CisgICAgZWxzZSBwd3NpLT5lcnJubyA9IChoX2Vycm5vIDwgMCkgPyB3c2FFcnJubygpIDogd3NhSGVycm5vKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2luZG93cyBzb2NrZXRzIGV4dGVuc2lvbnMgLS0gKgorICoJCQkJCQkJCSAgICAgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBhb3BfY29udHJvbCh3c19hc3luY19vcCogcF9hb3AsIGludCBmbGFnICkKK3sKKyAgdW5zaWduZWQJbExlbmd0aDsKKworICByZWFkKHBfYW9wLT5mZFswXSwgJmxMZW5ndGgsIHNpemVvZih1bnNpZ25lZCkpOworICBpZiggTE9XT1JEKGxMZW5ndGgpICkKKyAgICBpZiggTE9XT1JEKGxMZW5ndGgpIDw9IHBfYW9wLT5idWZsZW4gKQorICAgIHsKKyAgICAgIGNoYXIqIGJ1ZmZlciA9IChjaGFyKilQVFJfU0VHX1RPX0xJTihwX2FvcC0+YnVmZmVyX2Jhc2UpOworICAgICAgcmVhZChwX2FvcC0+ZmRbMF0sIGJ1ZmZlciwgTE9XT1JEKGxMZW5ndGgpKTsKKyAgICAgIHN3aXRjaCggcF9hb3AtPmZsYWdzICkKKyAgICAgIHsKKwljYXNlIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUU6CisJY2FzZSBXU01TR19BU1lOQ19IT1NUQllBRERSOiAKKwkgICAgIGZpeHVwX3dzaGUoKHN0cnVjdCB3c19ob3N0ZW50KilidWZmZXIsIHBfYW9wLT5idWZmZXJfYmFzZSk7IGJyZWFrOworCWNhc2UgV1NNU0dfQVNZTkNfUFJPVE9CWU5BTUU6CisJY2FzZSBXU01TR19BU1lOQ19QUk9UT0JZTlVNOgorCSAgICAgZml4dXBfd3NwZSgoc3RydWN0IHdzX3Byb3RvZW50KilidWZmZXIsIHBfYW9wLT5idWZmZXJfYmFzZSk7IGJyZWFrOworCWNhc2UgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRToKKwljYXNlIFdTTVNHX0FTWU5DX1NFUlZCWVBPUlQ6CisJICAgICBmaXh1cF93c3NlKChzdHJ1Y3Qgd3Nfc2VydmVudCopYnVmZmVyLCBwX2FvcC0+YnVmZmVyX2Jhc2UpOyBicmVhazsKKwlkZWZhdWx0OgorCSAgICAgaWYoIHBfYW9wLT5mbGFncyApIGZwcmludGYoc3RkZXJyLCJSZWNlaXZlZCB1bmtub3duIGFzeW5jIHJlcXVlc3QhXG4iKTsgCisJICAgICByZXR1cm4gQU9QX0NPTlRST0xfUkVNT1ZFOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIGxMZW5ndGggPSAgKChVSU5UMzIpTE9XT1JEKGxMZW5ndGgpKSB8ICgodW5zaWduZWQpV1NBRU5PQlVGUyA8PCAxNik7CisKKyNpZiAwCisgIHByaW50ZigiYXN5bmMgb3AgY29tcGxldGVkOiBoV25kIFslMDR4XSwgdU1zZyBbJTA0eF0sIGFvcCBbJTA0eF0sIGV2ZW50IFslMDh4XVxuIiwKKwkgcF9hb3AtPmhXbmQsIHBfYW9wLT51TXNnLCAoSEFORExFMTYpV1NfUFRSMkhBTkRMRShwX2FvcCksIChMUEFSQU0pbExlbmd0aCk7CisjZW5kaWYKKworICBQb3N0TWVzc2FnZShwX2FvcC0+aFduZCwgcF9hb3AtPnVNc2csIChIQU5ETEUxNilXU19QVFIySEFORExFKHBfYW9wKSwgKExQQVJBTSlsTGVuZ3RoKTsKKyAgcmV0dXJuIEFPUF9DT05UUk9MX1JFTU9WRTsKK30KKworCitzdGF0aWMgSEFORExFMTYgX19XU0FzeW5jREJRdWVyeShMUFdTSU5GTyBwd3NpLCBIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIExQQ1NUUiBpbml0LAorCQkJCSBJTlQxNiBsZW4sIElOVDE2IHR5cGUsIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4sIFVJTlQzMiBmbGFnKQoreworICAvKiBxdWV1ZSAnZmxhZycgcmVxdWVzdCBhbmQgZm9yayBvZmYgaXRzIGhhbmRsZXIgKi8KKworICBhc3luY19jdGwud3NfYW9wID0gKHdzX2FzeW5jX29wKilXU19BTExPQyhzaXplb2Yod3NfYXN5bmNfb3ApKTsKKworICBpZiggYXN5bmNfY3RsLndzX2FvcCApCisgIHsKKyAgICAgIEhBTkRMRTE2ICAgICAgICBoYW5kbGUgPSAoSEFORExFMTYpV1NfUFRSMkhBTkRMRShhc3luY19jdGwud3NfYW9wKTsKKworICAgICAgaWYoIHBpcGUoYXN5bmNfY3RsLndzX2FvcC0+ZmQpID09IDAgKQorICAgICAgeworCWFzeW5jX2N0bC53c19hb3AtPmluaXQgPSAoY2hhciopaW5pdDsKKwlhc3luY19jdGwubExlbmd0aCA9IGxlbjsKKwlhc3luY19jdGwubEV2ZW50ID0gdHlwZTsKKworICAgICAgICBhc3luY19jdGwud3NfYW9wLT5oV25kID0gaFduZDsKKyAgICAgICAgYXN5bmNfY3RsLndzX2FvcC0+dU1zZyA9IHVNc2c7CisKKwlhc3luY19jdGwud3NfYW9wLT5idWZmZXJfYmFzZSA9IHNidWY7IGFzeW5jX2N0bC53c19hb3AtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwlhc3luY19jdGwud3NfYW9wLT5mbGFncyA9IGZsYWc7CisJYXN5bmNfY3RsLndzX2FvcC0+YW9wX2NvbnRyb2wgPSAmYW9wX2NvbnRyb2w7CisJV0lOU09DS19saW5rX2FzeW5jX29wKCBhc3luY19jdGwud3NfYW9wICk7CisKKyAgICAgICAgYXN5bmNfY3RsLndzX2FvcC0+cGlkID0gZm9yaygpOworICAgICAgICBpZiggYXN5bmNfY3RsLndzX2FvcC0+cGlkICkKKyAgICAgICAgeworICAgICAgICAgICAgY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMV0pOyAgICAgICAgLyogd3JpdGUgZW5kcG9pbnQgKi8KKworICAgICAgICAgICAvKiBEYW1uLCBCU0QnaXNoIFNJR0lPIGRvZXNuJ3Qgd29yayBvbiBwaXBlcy9zdHJlYW1zCisgICAgICAgICAgICAqCisgICAgICAgICAgICAqIGFzeW5jX2lvKGFzeW5jX2N0bC53c19hb3AtPmZkWzBdLCAxKTsKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJcdGFzeW5jX29wID0gJTA0eCAoY2hpbGQgJWkpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBhc3luY19jdGwud3NfYW9wLT5waWQpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgLyogY2hpbGQgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0pOyAvKiByZWFkIGVuZHBvaW50ICovCisJCSAgIHN3aXRjaChmbGFnKQorCQkgICB7CisJCSAgICAgY2FzZSBXU01TR19BU1lOQ19IT1NUQllBRERSOgorCQkgICAgIGNhc2UgV1NNU0dfQVNZTkNfSE9TVEJZTkFNRToKKyAJCQlXU19kb19hc3luY19nZXRob3N0KHB3c2ksZmxhZyk7CisJCSAgICAgY2FzZSBXU01TR19BU1lOQ19QUk9UT0JZTlVNOgorCQkgICAgIGNhc2UgV1NNU0dfQVNZTkNfUFJPVE9CWU5BTUU6CisJCQlXU19kb19hc3luY19nZXRwcm90byhwd3NpLGZsYWcpOworCQkgICAgIGNhc2UgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVDoKKwkJICAgICBjYXNlIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUU6CisJCQlXU19kb19hc3luY19nZXRzZXJ2KHB3c2ksZmxhZyk7CisJCSAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgICAgV1NfRlJFRShhc3luY19jdGwud3NfYW9wKTsKKyAgICAgIHB3c2ktPmVycm5vID0gd3NhRXJybm8oKTsKKyAgfSBlbHNlIHB3c2ktPmVycm5vID0gV1NBRVdPVUxEQkxPQ0s7CisgIHJldHVybiAwOworfQorCitIQU5ETEUxNiBXU0FBc3luY0dldEhvc3RCeUFkZHIoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBMUENTVFIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBsZW4sIElOVDE2IHR5cGUsIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4pCit7CisgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0SG9zdEJ5QWRkciglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgYWRkciAlMDh4WyVpXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csICh1bnNpZ25lZClhZGRyICwgbGVuICk7CisKKyAgaWYoIHB3c2kgKSAKKyAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBhZGRyLCBsZW4sCisJCQkgICAgdHlwZSwgc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19IT1NUQllBRERSICk7CisgIHJldHVybiAwOworfQorCisKK0hBTkRMRTE2IFdTQUFzeW5jR2V0SG9zdEJ5TmFtZShIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIExQQ1NUUiBuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldEhvc3RCeU5hbWUoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIGhvc3QgJXMsIGJ1ZmZlciAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAoaW50KWJ1ZmxlbiApOworCisgIGlmKCBwd3NpICkKKyAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfSE9TVEJZTkFNRSApOworICByZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAKKworCitIQU5ETEUxNiBXU0FBc3luY0dldFByb3RvQnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgTFBDU1RSIG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFByb3RvQnlOYW1lKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBwcm90b2NvbCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HICk7CisKKyAgaWYoIHB3c2kgKQorICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIG5hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTkFNRSApOworICByZXR1cm4gMDsKK30KKworCitIQU5ETEUxNiBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBJTlQxNiBudW1iZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4pCit7CisgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0UHJvdG9CeU51bWJlciglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgbnVtICVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgbnVtYmVyICk7CisKKyAgaWYoIHB3c2kgKQorICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLCBzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1BST1RPQllOVU0gKTsKKyAgcmV0dXJuIDA7Cit9CisKKworSEFORExFMTYgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgTFBDU1RSIG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBwcm90bywgU0VHUFRSIHNidWYsIElOVDE2IGJ1ZmxlbikKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlOYW1lKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBuYW1lICVzLCBwcm90byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKKworICBpZiggcHdzaSApCisgIHsgCisgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IChjaGFyKilwcm90bzsKKyAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRSApOworICB9CisgIHJldHVybiAwOworfQorCisKK0hBTkRMRTE2IFdTQUFzeW5jR2V0U2VydkJ5UG9ydChIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIElOVDE2IHBvcnQsIAorCQkJICAgICAgIExQQ1NUUiBwcm90bywgU0VHUFRSIHNidWYsIElOVDE2IGJ1ZmxlbikKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlQb3J0KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBwb3J0ICVpLCBwcm90byAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CisKKyAgaWYoIHB3c2kgKQorICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIHByb3RvLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCApOworICByZXR1cm4gMDsKK30KKworSU5UMTYgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KEhBTkRMRTE2IGhBc3luY1Rhc2tIYW5kbGUpCit7CisgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisgIHdzX2FzeW5jX29wKgkJcF9hb3AgPSAod3NfYXN5bmNfb3AqKVdTX0hBTkRMRTJQVFIoaEFzeW5jVGFza0hhbmRsZSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0NhbmNlbEFzeW5jUmVxdWVzdCglMDh4KTogaGFuZGxlICUwNHhcbiIsIAorCQkJICAgKHVuc2lnbmVkKXB3c2ksIGhBc3luY1Rhc2tIYW5kbGUpOworICBpZiggcHdzaSApCisgICAgaWYoIFdJTlNPQ0tfY2hlY2tfYXN5bmNfb3AocF9hb3ApICkKKyAgICB7CisgIAlraWxsKHBfYW9wLT5waWQsIFNJR0tJTEwpOyAKKwl3YWl0cGlkKHBfYW9wLT5waWQsIE5VTEwsIDApOworCWNsb3NlKHBfYW9wLT5mZFswXSk7CisJV0lOU09DS191bmxpbmtfYXN5bmNfb3AocF9hb3ApOworCVdTX0ZSRUUocF9hb3ApOworCXJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRUlOVkFMOworICByZXR1cm4gU09DS0VUX0VSUk9SOworfQorCisvKiAtLS0tLSBhc3luY2hyb25vdXMgc2VsZWN0KCkgKi8KKworaW50IGRlbGV0ZV9hc3luY19vcCh3c19zb2NrZXQqIHB3cykKK3sKKyAgaWYoIHB3cy0+cF9hb3AgKQorICB7CisgICAga2lsbChwd3MtPnBfYW9wLT5waWQsIFNJR0tJTEwpOworICAgIHdhaXRwaWQocHdzLT5wX2FvcC0+cGlkLCBOVUxMLCAwKTsKKyAgICBXU19GUkVFKHB3cy0+cF9hb3ApOyByZXR1cm4gMTsKKyAgICBwd3MtPmZsYWdzICY9IFdTX0ZEX0lOVEVSTkFMOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIF9zaWd1c3IxX2hhbmRsZXJfcGFyZW50KGludCBzaWcpCit7CisgIC8qIGNoaWxkIHByb2Nlc3MgcHV0cyBNVFlQRV9DTElFTlQgZGF0YSBwYWNrZXQgaW50byB0aGUKKyAgICogJ2FzeW5jX3FpZCcgbWVzc2FnZSBxdWV1ZSBhbmQgc2lnbmFscyB1cyB3aXRoIFNJR1VTUjEuCisgICAqIFRoaXMgaGFuZGxlciByZWFkcyB0aGUgcXVldWUgYW5kIHBvc3RzICd1TXNnJyBub3RpZmljYXRpb24KKyAgICogbWVzc2FnZS4KKyAgICovCisKKyAgaXBjX3BhY2tldAkJaXBhY2s7CisKKyAgc2lnbmFsKCBTSUdVU1IxLCBfc2lndXNyMV9oYW5kbGVyX3BhcmVudCk7CisgIHdoaWxlKCBtc2dyY3YoYXN5bmNfcWlkLCAoc3RydWN0IG1zZ2J1ZiopJmlwYWNrLAorICAgICAgICAgIE1UWVBFX0NMSUVOVF9TSVpFLCBNVFlQRV9DTElFTlQsIElQQ19OT1dBSVQpICE9IC0xICkKKyAgeworICAgIGlmKCBpcGFjay53UGFyYW0gJiYgYWJzKChzaG9ydClpcGFjay53UGFyYW0pIDwgMzI3NjggKQorICAgIHsKKyAgICAgIHdzX3NvY2tldCogICAgICAgIHB3cyA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIoaXBhY2sud1BhcmFtKTsKKyAgICAgIGlmKCBwd3MtPnBfYW9wICYmIGFicygoY2hhciopX3dzX3N0dWIgLSAoY2hhciopcHdzLT5wX2FvcCkgPCAzMjc2OCApCisgICAgICB7CisJICBwd3MtPmZsYWdzICY9IH4oaXBhY2subFBhcmFtKTsKKyNpZiAwCisgICAgICAgICAgcHJpbnRmKCJhc3luYyBldmVudCAtIGhXbmQgJTA0eCwgdU1zZyAlMDR4IFslMDh4XVxuIiwKKyAgICAgICAgICAgICAgICAgIHB3cy0+cF9hb3AtPmhXbmQsIHB3cy0+cF9hb3AtPnVNc2csIGlwYWNrLmxQYXJhbSApOworI2VuZGlmCisJICBQb3N0TWVzc2FnZShwd3MtPnBfYW9wLT5oV25kLCBwd3MtPnBfYW9wLT51TXNnLCAKKwkJICAgICAoV1BBUkFNMTYpaXBhY2sud1BhcmFtLCAoTFBBUkFNKWlwYWNrLmxQYXJhbSApOworICAgICAgfQorICAgICAgZWxzZSBmcHJpbnRmKHN0ZGVyciwiQXN5bmNTZWxlY3Q6c3RyYXkgYXN5bmNfb3AgaW4gc29ja2V0ICUwNHghXG4iLCBpcGFjay53UGFyYW0pOworICAgIH0KKyAgICBlbHNlIGZwcmludGYoc3RkZXJyLCJBc3luY1NlbGVjdDpzdHJheSBzb2NrZXQgYXQgJTA0eCFcbiIsIGlwYWNrLndQYXJhbSk7CisgIH0KK30KKworaW50IG5vdGlmeV9jbGllbnQoIHdzX3NvY2tldCogcHdzLCB1bnNpZ25lZCBmbGFnICkKK3sKKyAgaWYoIHB3cy0+cF9hb3AgJiYgKChwd3MtPnBfYW9wLT5mbGFncyAmIGZsYWcpIHx8CisJCSAgICAgKGZsYWcgPT0gV1NfRkRfQ09OTkVDVEVEICYmIHB3cy0+ZmxhZ3MgJiBXU19GRF9DT05ORUNUKSkgKQorICB7CisgICAgIGFzeW5jX2N0bC5pcC5tdHlwZSA9IE1UWVBFX1BBUkVOVDsKKyAgICAgYXN5bmNfY3RsLmlwLmxQYXJhbSA9IGZsYWc7CisgICAgIHdoaWxlKCBtc2dzbmQoYXN5bmNfcWlkLCAoc3RydWN0IG1zZ2J1ZiopJihhc3luY19jdGwuaXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UWVBFX1BBUkVOVF9TSVpFLCAwKSA9PSAtMSApCisgICAgIHsgCisJaWYoIGVycm5vID09IEVJTlRSICkgY29udGludWU7CisJZWxzZQorCXsKKwkgICAgcGVycm9yKCJBc3luY1NlbGVjdChwYXJlbnQpIik7IAorCSAgICBkZWxldGVfYXN5bmNfb3AocHdzKTsKKwkgICAgcHdzLT5mbGFncyAmPSBXU19GRF9JTlRFUk5BTDsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgICB9CisgICAgIGtpbGwocHdzLT5wX2FvcC0+cGlkLCBTSUdVU1IxKTsKKyAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0lOVDE2IGluaXRfYXN5bmNfc2VsZWN0KHdzX3NvY2tldCogcHdzLCBIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIFVJTlQzMiBsRXZlbnQpCit7CisgICAgd3NfYXN5bmNfb3AqICAgICAgICBwX2FvcDsKKworICAgIGlmKCBkZWxldGVfYXN5bmNfb3AocHdzKSApICAvKiBkZWxldGUgb2xkIGFzeW5jIGhhbmRsZXIgaWYgYW55ICovCisgICAgeworICAgICAgcHdzLT5wX2FvcCA9IE5VTEw7CisgICAgICBwd3MtPmZsYWdzICY9IFdTX0ZEX0lOVEVSTkFMOworICAgIH0KKyAgICBpZiggbEV2ZW50ID09IDAgKSByZXR1cm4gMDsKKworICAgIC8qIHNldHVwIGFzeW5jIGhhbmRsZXIgLSBzb21lIGRhdGEgbWF5IGJlIHJlZHVuZGFudCAqLworCisgICAgV0lOU09DS191bmJsb2NrX2lvKHB3cy0+ZmQsIDEpOworICAgIGlmKCAocF9hb3AgPSAod3NfYXN5bmNfb3AqKVdTX0FMTE9DKHNpemVvZih3c19hc3luY19vcCkpKSApCisgICAgeworICAgICAgcF9hb3AtPmhXbmQgPSBoV25kOworICAgICAgcF9hb3AtPnVNc2cgPSB1TXNnOworICAgICAgcHdzLT5wX2FvcCA9IHBfYW9wOworCisgICAgICBhc3luY19jdGwubEV2ZW50ID0gcF9hb3AtPmZsYWdzID0gbEV2ZW50OworICAgICAgYXN5bmNfY3RsLndzX3NvY2sgPSBwd3M7CisgICAgICBhc3luY19jdGwuaXAud1BhcmFtID0gKFVJTlQxNilXU19QVFIySEFORExFKHB3cyk7CisgICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gMDsKKworICAgICAgcF9hb3AtPnBpZCA9IGZvcmsoKTsKKyAgICAgIGlmKCBwX2FvcC0+cGlkICE9IC0xICkKKyAgICAgICAgaWYoIHBfYW9wLT5waWQgPT0gMCApIFdJTlNPQ0tfZG9fYXN5bmNfc2VsZWN0KCk7IC8qIGNoaWxkIHByb2Nlc3MgKi8KKwllbHNlIHB3cy0+ZmxhZ3MgfD0gbEV2ZW50OworCisgICAgICBzaWduYWwoIFNJR1VTUjEsIF9zaWd1c3IxX2hhbmRsZXJfcGFyZW50ICk7CisgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2luZSBwcm9jZXNzICovCisgICAgfQorICAgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK0lOVDE2IFdTQUFzeW5jU2VsZWN0KFNPQ0tFVDE2IHMsIEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgVUlOVDMyIGxFdmVudCkKK3sKKyAgd3Nfc29ja2V0KiAgICBwd3MgID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUihzKTsKKyAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jU2VsZWN0KCUwOHgpOiAlMDR4LCBoV25kICUwNHgsIHVNc2cgJTA0eCwgZXZlbnQgJTA4eFxuIiwKKwkJCSAgKHVuc2lnbmVkKXB3c2ksIHMsIGhXbmQsIHVNc2csICh1bnNpZ25lZClsRXZlbnQgKTsKKyAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKKyAgICBpZiggaW5pdF9hc3luY19zZWxlY3QocHdzLCBoV25kLCB1TXNnLCBsRXZlbnQpID09IDAgKSByZXR1cm4gMDsKKyAgICBlbHNlIHB3c2ktPmVycm5vID0gV1NBRU5PQlVGUzsKKyAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsgCit9CisKKy8qIC0tLS0tIG1pc2NlbGxhbmVvdXMgKi8KKworSU5UMTYgX19XU0FGRElzU2V0KFNPQ0tFVDE2IGZkLCB3c19mZF9zZXQgKnNldCkKK3sKKyAgaW50IGkgPSBzZXQtPmZkX2NvdW50OworICAKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldCglZCwlOGx4KVxuIixmZCwodW5zaWduZWQgbG9uZylzZXQpOworICAgIAorICB3aGlsZSAoaS0tKQorICAgICAgaWYgKHNldC0+ZmRfYXJyYXlbaV0gPT0gZmQpIHJldHVybiAxOworICByZXR1cm4gMDsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworQk9PTDE2IFdTQUlzQmxvY2tpbmcodm9pZCkKK3sKKyAgLyogQnkgZGVmYXVsdCBXaW5Tb2NrIHNob3VsZCBzZXQgYWxsIGl0cyBzb2NrZXRzIHRvIG5vbi1ibG9ja2luZyBtb2RlCisgICAqIGFuZCBwb2xsIGluIFBlZWtNZXNzYWdlIGxvb3Agd2hlbiBwcm9jZXNzaW5nICJibG9ja2luZyIgb25lcy4gVGhpcyAKKyAgICogZnVuY3Rpb24gKiBpcyBzdXBwb3NlZCB0byB0ZWxsIGlmIHByb2dyYW0gaXMgaW4gdGhpcyBsb29wLiBPdXIgCisgICAqIGJsb2NraW5nIGNhbGxzIGFyZSB0cnVseSBibG9ja2luZyBzbyB3ZSBhbHdheXMgcmV0dXJuIEZBTFNFLgorICAgKgorICAgKiBOb3RlOiBJdCBpcyBhbGxvd2VkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRob3V0IHByaW9yIFdTQVN0YXJ0dXAoKS4KKyAgICovCisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0lzQmxvY2tpbmcoKVxuIik7CisgIHJldHVybiBGQUxTRTsKK30KKworSU5UMTYgV1NBQ2FuY2VsQmxvY2tpbmdDYWxsKHZvaWQpCit7CisgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0NhbmNlbEJsb2NraW5nQ2FsbCglMDh4KVxuIiwgKHVuc2lnbmVkKXB3c2kpOworCisgIGlmKCBwd3NpICkgcmV0dXJuIDA7CisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK0ZBUlBST0MxNiBXU0FTZXRCbG9ja2luZ0hvb2soRkFSUFJPQzE2IGxwQmxvY2tGdW5jKQoreworICBGQVJQUk9DMTYJCXByZXY7CisgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NldEJsb2NraW5nSG9vayglMDh4KTogaG9vayAlMDh4XG4iLCAKKwkJCSAgKHVuc2lnbmVkKXB3c2ksICh1bnNpZ25lZCkgbHBCbG9ja0Z1bmMpOworCisgIGlmKCBwd3NpICkgeyAKKyAgICAgIHByZXYgPSBwd3NpLT5ibG9ja2luZ19ob29rOyAKKyAgICAgIHB3c2ktPmJsb2NraW5nX2hvb2sgPSBscEJsb2NrRnVuYzsgCisgICAgICByZXR1cm4gcHJldjsgCisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0lOVDE2IFdTQVVuaG9va0Jsb2NraW5nSG9vayh2b2lkKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Vbmhvb2tCbG9ja2luZ0hvb2soJTA4eClcbiIsICh1bnNpZ25lZClwd3NpKTsKKyAgaWYoIHB3c2kgKSByZXR1cm4gKElOVDE2KShJTlQzMikocHdzaS0+YmxvY2tpbmdfaG9vayA9IChGQVJQUk9DMTYpTlVMTCk7CisgIHJldHVybiBTT0NLRVRfRVJST1I7Cit9CisKK1ZPSUQKK1dzQ29udHJvbChEV09SRCB4MSxEV09SRCB4MixMUERXT1JEIHgzLExQRFdPUkQgeDQsTFBEV09SRCB4NSxMUERXT1JEIHg2KSAKK3sKKwlmcHJpbnRmKHN0ZG5pbXAsIldzQ29udHJvbCglbHgsJWx4LCVwLCVwLCVwLCVwKVxuIiwKKwkJeDEseDIseDMseDQseDUseDYKKwkpOworCWZwcmludGYoc3RkbmltcCwiV3NDb250cm9sKHgseCwlbHgsJWx4LCVseCwlbHgpXG4iLAorCQl4Mz8qeDM6MCx4ND8qeDQ6MCx4NT8qeDU6MCx4Nj8qeDY6MAorCSk7CisJcmV0dXJuOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIG9mIEFQSSBzdHVmZiAqLworCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVyIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IGxpc3Rfc2l6ZShjaGFyKiogbCwgaW50IGl0ZW1fc2l6ZSkKK3sKKyAgaW50IGksaiA9IDA7CisgIGlmKGwpCisgIHsgZm9yKGk9MDtsW2ldO2krKykgCisJaiArPSAoaXRlbV9zaXplKSA/IGl0ZW1fc2l6ZSA6IHN0cmxlbihsW2ldKSArIDE7CisgICAgaiArPSAoaSArIDEpICogc2l6ZW9mKGNoYXIqKTsgfQorICByZXR1cm4gajsKK30KKworc3RhdGljIGludCBsaXN0X2R1cChjaGFyKiogbF9zcmMsIGNoYXIqIHJlZiwgY2hhciogYmFzZSwgaW50IGl0ZW1fc2l6ZSkKK3sgCisgICAvKiBiYXNlIGlzIGVpdGhlciBlaXRoZXIgZXF1YWwgdG8gcmVmIG9yIDAgb3IgU0VHUFRSICovCisKKyAgIGNoYXIqCQlwID0gcmVmOworICAgY2hhcioqCQlsX3RvID0gKGNoYXIqKilyZWY7CisgICBpbnQJCQlpLGosazsKKworICAgZm9yKGo9MDtsX3NyY1tqXTtqKyspIDsKKyAgIHAgKz0gKGogKyAxKSAqIHNpemVvZihjaGFyKik7CisgICBmb3IoaT0wO2k8ajtpKyspCisgICB7IGxfdG9baV0gPSBiYXNlICsgKHAgLSByZWYpOworICAgICBrID0gKCBpdGVtX3NpemUgKSA/IGl0ZW1fc2l6ZSA6IHN0cmxlbihsX3NyY1tpXSkgKyAxOworICAgICBtZW1jcHkocCwgbF9zcmNbaV0sIGspOyBwICs9IGs7IH0KKyAgIGxfdG9baV0gPSBOVUxMOworICAgcmV0dXJuIChwIC0gcmVmKTsKK30KKworLyogLS0tLS0gaG9zdGVudCAqLworCitzdGF0aWMgaW50IGhvc3RlbnRfc2l6ZShzdHJ1Y3QgaG9zdGVudCogcF9oZSkKK3sKKyAgaW50IHNpemUgPSAwOworICBpZiggcF9oZSApCisgIHsgc2l6ZSAgPSBzaXplb2Yoc3RydWN0IGhvc3RlbnQpOyAKKyAgICBzaXplICs9IHN0cmxlbihwX2hlLT5oX25hbWUpICsgMTsKKyAgICBzaXplICs9IGxpc3Rfc2l6ZShwX2hlLT5oX2FsaWFzZXMsIDApOyAgCisgICAgc2l6ZSArPSBsaXN0X3NpemUocF9oZS0+aF9hZGRyX2xpc3QsIHBfaGUtPmhfbGVuZ3RoICk7IH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBXU19kdXBfaGUoTFBXU0lORk8gcHdzaSwgc3RydWN0IGhvc3RlbnQqIHBfaGUsIGludCBmbGFnKQoreworICAgLyogRHVwbGljYXRlIGhvc3RlbnQgc3RydWN0dXJlIGFuZCBmbGF0dGVuIGRhdGEgKHdpdGggaXRzIHBvaW50ZXJzKQorICAgICogaW50byBwd3NpLT5idWZmZXIuIEludGVybmFsIHBvaW50ZXJzIGNhbiBiZSBsaW5lYXIsIFNFR1BUUiwgb3IgCisgICAgKiByZWxhdGl2ZSB0byAwIGRlcGVuZGluZyBvbiAiZmxhZyIgdmFsdWUuIFJldHVybiBkYXRhIHNpemUgKGFsc28gCisgICAgKiBpbiB0aGUgcHdzaS0+YnVmbGVuKS4KKyAgICAqLworCisgICBpbnQgc2l6ZSA9IGhvc3RlbnRfc2l6ZShwX2hlKTsKKyAgIGlmKCBzaXplICkKKyAgIHsKKyAgICAgY2hhciogICAgICAgICAgIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2FkZHIsKnBfYmFzZSwqcDsKKworICAgICBfY2hlY2tfYnVmZmVyKHB3c2ksIHNpemUpOworICAgICBwID0gcHdzaS0+YnVmZmVyOworICAgICBwX2Jhc2UgPSAoZmxhZyAmIFdTX0RVUF9PRkZTRVQpID8gTlVMTAorCQkJCSAgICAgOiAoKGZsYWcgJiBXU19EVVBfU0VHUFRSKSA/IChjaGFyKilTRUdQVFJfR0VUKHApIDogcCk7CisgICAgIHAgKz0gKGZsYWcgJiBXU19EVVBfU0VHUFRSKSA/IHNpemVvZihzdHJ1Y3Qgd3NfaG9zdGVudCkgOiBzaXplb2Yoc3RydWN0IGhvc3RlbnQpOworICAgICBwX25hbWUgPSBwOworICAgICBzdHJjcHkocCwgcF9oZS0+aF9uYW1lKTsgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICBwX2FsaWFzZXMgPSBwOworICAgICBwICs9IGxpc3RfZHVwKHBfaGUtPmhfYWxpYXNlcywgcCwgcF9iYXNlICsgKHAgLSBwd3NpLT5idWZmZXIpLCAwKTsKKyAgICAgcF9hZGRyID0gcDsKKyAgICAgbGlzdF9kdXAocF9oZS0+aF9hZGRyX2xpc3QsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgcF9oZS0+aF9sZW5ndGgpOworICAgICBpZiggIShmbGFnICYgV1NfRFVQX1NFR1BUUikgKQorICAgICB7IHN0cnVjdCBob3N0ZW50KiBwX3RvID0gKHN0cnVjdCBob3N0ZW50Kilwd3NpLT5idWZmZXI7CisgICAgICAgcF90by0+aF9hZGRydHlwZSA9IHBfaGUtPmhfYWRkcnR5cGU7IHBfdG8tPmhfbGVuZ3RoID0gcF9oZS0+aF9sZW5ndGg7CisgICAgICAgcF90by0+aF9uYW1lID0gcF9iYXNlICsgKHBfbmFtZSAtIHB3c2ktPmJ1ZmZlcik7CisgICAgICAgcF90by0+aF9hbGlhc2VzID0gKGNoYXIqKikocF9iYXNlICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOworICAgICAgIHBfdG8tPmhfYWRkcl9saXN0ID0gKGNoYXIqKikocF9iYXNlICsgKHBfYWRkciAtIHB3c2ktPmJ1ZmZlcikpOyB9CisgICAgIGVsc2UKKyAgICAgeyBzdHJ1Y3Qgd3NfaG9zdGVudCogcF90byA9IChzdHJ1Y3Qgd3NfaG9zdGVudCopcHdzaS0+YnVmZmVyOworICAgICAgIHBfdG8tPmhfYWRkcnR5cGUgPSAoSU5UMTYpcF9oZS0+aF9hZGRydHlwZTsgCisgICAgICAgcF90by0+aF9sZW5ndGggPSAoSU5UMTYpcF9oZS0+aF9sZW5ndGg7CisgICAgICAgcF90by0+aF9uYW1lID0gKFNFR1BUUikocF9iYXNlICsgKHBfbmFtZSAtIHB3c2ktPmJ1ZmZlcikpOworICAgICAgIHBfdG8tPmhfYWxpYXNlcyA9IChTRUdQVFIpKHBfYmFzZSArIChwX2FsaWFzZXMgLSBwd3NpLT5idWZmZXIpKTsKKyAgICAgICBwX3RvLT5oX2FkZHJfbGlzdCA9IChTRUdQVFIpKHBfYmFzZSArIChwX2FkZHIgLSBwd3NpLT5idWZmZXIpKTsKKyAgICAgICByZXR1cm4gKHNpemUgKyBzaXplb2Yoc3RydWN0IHdzX2hvc3RlbnQpIC0gc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSk7IH0KKyAgIH0KKyAgIHJldHVybiBzaXplOworfQorCit2b2lkIGZpeHVwX3dzaGUoc3RydWN0IHdzX2hvc3RlbnQqIHBfd3NoZSwgU0VHUFRSIGJhc2UpCit7CisgICAvKiBhZGQgJ2Jhc2UnIHRvIHdzX2hvc3RlbnQgcG9pbnRlcnMgdG8gY29udmVydCB0aGVtIGZyb20gb2Zmc2V0cyAqLyAKKworICAgaW50IGk7CisgICB1bnNpZ25lZCoJcF9hbGlhc2VzLCpwX2FkZHI7CisKKyAgIHBfYWxpYXNlcyA9ICh1bnNpZ25lZCopKChjaGFyKilwX3dzaGUgKyAodW5zaWduZWQpcF93c2hlLT5oX2FsaWFzZXMpOyAKKyAgIHBfYWRkciA9ICh1bnNpZ25lZCopKChjaGFyKilwX3dzaGUgKyAodW5zaWduZWQpcF93c2hlLT5oX2FkZHJfbGlzdCk7CisgICAoKHVuc2lnbmVkKShwX3dzaGUtPmhfbmFtZSkpICs9ICh1bnNpZ25lZCliYXNlOworICAgKCh1bnNpZ25lZCkocF93c2hlLT5oX2FsaWFzZXMpKSArPSAodW5zaWduZWQpYmFzZTsKKyAgICgodW5zaWduZWQpKHBfd3NoZS0+aF9hZGRyX2xpc3QpKSArPSAodW5zaWduZWQpYmFzZTsKKyAgIGZvcihpPTA7cF9hbGlhc2VzW2ldO2krKykgcF9hbGlhc2VzW2ldICs9ICh1bnNpZ25lZCliYXNlOworICAgZm9yKGk9MDtwX2FkZHJbaV07aSsrKSBwX2FkZHJbaV0gKz0gKHVuc2lnbmVkKWJhc2U7Cit9CisKKy8qIC0tLS0tIHByb3RvZW50ICovCisKK3N0YXRpYyBpbnQgcHJvdG9lbnRfc2l6ZShzdHJ1Y3QgcHJvdG9lbnQqIHBfcGUpCit7CisgIGludCBzaXplID0gMDsKKyAgaWYoIHBfcGUgKQorICB7IHNpemUgID0gc2l6ZW9mKHN0cnVjdCBwcm90b2VudCk7CisgICAgc2l6ZSArPSBzdHJsZW4ocF9wZS0+cF9uYW1lKSArIDE7CisgICAgc2l6ZSArPSBsaXN0X3NpemUocF9wZS0+cF9hbGlhc2VzLCAwKTsgfQorICByZXR1cm4gc2l6ZTsKK30KKworaW50IFdTX2R1cF9wZShMUFdTSU5GTyBwd3NpLCBzdHJ1Y3QgcHJvdG9lbnQqIHBfcGUsIGludCBmbGFnKQoreworICAgaW50IHNpemUgPSBwcm90b2VudF9zaXplKHBfcGUpOworICAgaWYoIHNpemUgKQorICAgeworICAgICBjaGFyKiAgICAgICAgICAgIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2Jhc2UsKnA7CisKKyAgICAgX2NoZWNrX2J1ZmZlcihwd3NpLCBzaXplKTsKKyAgICAgcCA9IHB3c2ktPmJ1ZmZlcjsgCisgICAgIHBfYmFzZSA9IChmbGFnICYgV1NfRFVQX09GRlNFVCkgPyBOVUxMCisJCQkJICAgICA6ICgoZmxhZyAmIFdTX0RVUF9TRUdQVFIpID8gKGNoYXIqKVNFR1BUUl9HRVQocCkgOiBwKTsKKyAgICAgcCArPSAoZmxhZyAmIFdTX0RVUF9TRUdQVFIpPyBzaXplb2Yoc3RydWN0IHdzX3Byb3RvZW50KSA6IHNpemVvZihzdHJ1Y3QgcHJvdG9lbnQpOworICAgICBwX25hbWUgPSBwOworICAgICBzdHJjcHkocCwgcF9wZS0+cF9uYW1lKTsgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICBwX2FsaWFzZXMgPSBwOworICAgICBsaXN0X2R1cChwX3BlLT5wX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgMCk7CisgICAgIGlmKCAhKGZsYWcgJiBXU19EVVBfTkFUSVZFKSApCisgICAgIHsgc3RydWN0IHByb3RvZW50KiBwX3RvID0gKHN0cnVjdCBwcm90b2VudCopcHdzaS0+YnVmZmVyOworICAgICAgIHBfdG8tPnBfcHJvdG8gPSBwX3BlLT5wX3Byb3RvOworICAgICAgIHBfdG8tPnBfbmFtZSA9IHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOyAKKyAgICAgICBwX3RvLT5wX2FsaWFzZXMgPSAoY2hhcioqKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7IH0KKyAgICAgZWxzZQorICAgICB7IHN0cnVjdCB3c19wcm90b2VudCogcF90byA9IChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKXB3c2ktPmJ1ZmZlcjsKKyAgICAgICBwX3RvLT5wX3Byb3RvID0gKElOVDE2KXBfcGUtPnBfcHJvdG87CisgICAgICAgcF90by0+cF9uYW1lID0gKFNFR1BUUikocF9iYXNlKSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOworICAgICAgIHBfdG8tPnBfYWxpYXNlcyA9IChTRUdQVFIpKChwX2Jhc2UpICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOyAKKyAgICAgICByZXR1cm4gKHNpemUgKyBzaXplb2Yoc3RydWN0IHdzX3Byb3RvZW50KSAtIHNpemVvZihzdHJ1Y3QgcHJvdG9lbnQpKTsgfQorICAgfQorICAgcmV0dXJuIHNpemU7Cit9CisKK3ZvaWQgZml4dXBfd3NwZShzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfd3NwZSwgU0VHUFRSIGJhc2UpCit7CisgICBpbnQgaTsKKyAgIHVuc2lnbmVkKiAgICAgICBwX2FsaWFzZXMgPSAodW5zaWduZWQqKSgoY2hhciopcF93c3BlICsgKHVuc2lnbmVkKXBfd3NwZS0+cF9hbGlhc2VzKTsgCisgICAoKHVuc2lnbmVkKShwX3dzcGUtPnBfbmFtZSkpICs9ICh1bnNpZ25lZCliYXNlOworICAgKCh1bnNpZ25lZCkocF93c3BlLT5wX2FsaWFzZXMpKSArPSAodW5zaWduZWQpYmFzZTsKKyAgIGZvcihpPTA7cF9hbGlhc2VzW2ldO2krKykgcF9hbGlhc2VzW2ldICs9ICh1bnNpZ25lZCliYXNlOworfQorCisvKiAtLS0tLSBzZXJ2ZW50ICovCisKK3N0YXRpYyBpbnQgc2VydmVudF9zaXplKHN0cnVjdCBzZXJ2ZW50KiBwX3NlKQoreworICBpbnQgc2l6ZSA9IDA7CisgIGlmKCBwX3NlICkKKyAgeyBzaXplICs9IHNpemVvZihzdHJ1Y3Qgc2VydmVudCk7CisgICAgc2l6ZSArPSBzdHJsZW4ocF9zZS0+c19wcm90bykgKyBzdHJsZW4ocF9zZS0+c19uYW1lKSArIDI7CisgICAgc2l6ZSArPSBsaXN0X3NpemUocF9zZS0+c19hbGlhc2VzLCAwKTsgfQorICByZXR1cm4gc2l6ZTsKK30KKworaW50IFdTX2R1cF9zZShMUFdTSU5GTyBwd3NpLCBzdHJ1Y3Qgc2VydmVudCogcF9zZSwgaW50IGZsYWcpCit7CisgICBpbnQgc2l6ZSA9IHNlcnZlbnRfc2l6ZShwX3NlKTsKKyAgIGlmKCBzaXplICkKKyAgIHsKKyAgICAgY2hhciogICAgICAgICAgIHBfbmFtZSwqcF9hbGlhc2VzLCpwX3Byb3RvLCpwX2Jhc2UsKnA7CisKKyAgICAgX2NoZWNrX2J1ZmZlcihwd3NpLCBzaXplKTsKKyAgICAgcCA9IHB3c2ktPmJ1ZmZlcjsKKyAgICAgcF9iYXNlID0gKGZsYWcgJiBXU19EVVBfT0ZGU0VUKSA/IE5VTEwgCisJCQkJICAgICA6ICgoZmxhZyAmIFdTX0RVUF9TRUdQVFIpID8gKGNoYXIqKVNFR1BUUl9HRVQocCkgOiBwKTsKKyAgICAgcCArPSAoZmxhZyAmIFdTX0RVUF9TRUdQVFIpPyBzaXplb2Yoc3RydWN0IHdzX3NlcnZlbnQpIDogc2l6ZW9mKHN0cnVjdCBzZXJ2ZW50KTsKKyAgICAgcF9uYW1lID0gcDsKKyAgICAgc3RyY3B5KHAsIHBfc2UtPnNfbmFtZSk7IHAgKz0gc3RybGVuKHApICsgMTsKKyAgICAgcF9wcm90byA9IHA7CisgICAgIHN0cmNweShwLCBwX3NlLT5zX3Byb3RvKTsgcCArPSBzdHJsZW4ocCkgKyAxOworICAgICBwX2FsaWFzZXMgPSBwOworICAgICBsaXN0X2R1cChwX3NlLT5zX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgMCk7CisKKyAgICAgaWYoICEoZmxhZyAmIFdTX0RVUF9TRUdQVFIpICkKKyAgICAgeyBzdHJ1Y3Qgc2VydmVudCogcF90byA9IChzdHJ1Y3Qgc2VydmVudCopcHdzaS0+YnVmZmVyOworICAgICAgIHBfdG8tPnNfcG9ydCA9IHBfc2UtPnNfcG9ydDsKKyAgICAgICBwX3RvLT5zX25hbWUgPSBwX2Jhc2UgKyAocF9uYW1lIC0gcHdzaS0+YnVmZmVyKTsgCisgICAgICAgcF90by0+c19wcm90byA9IHBfYmFzZSArIChwX3Byb3RvIC0gcHdzaS0+YnVmZmVyKTsKKyAgICAgICBwX3RvLT5zX2FsaWFzZXMgPSAoY2hhcioqKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7IH0KKyAgICAgZWxzZQorICAgICB7IHN0cnVjdCB3c19zZXJ2ZW50KiBwX3RvID0gKHN0cnVjdCB3c19zZXJ2ZW50Kilwd3NpLT5idWZmZXI7CisgICAgICAgcF90by0+c19wb3J0ID0gKElOVDE2KXBfc2UtPnNfcG9ydDsKKyAgICAgICBwX3RvLT5zX25hbWUgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9uYW1lIC0gcHdzaS0+YnVmZmVyKSk7CisgICAgICAgcF90by0+c19wcm90byA9IChTRUdQVFIpKHBfYmFzZSArIChwX3Byb3RvIC0gcHdzaS0+YnVmZmVyKSk7CisgICAgICAgcF90by0+c19hbGlhc2VzID0gKFNFR1BUUikocF9iYXNlICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOyAKKyAgICAgICByZXR1cm4gKHNpemUgKyBzaXplb2Yoc3RydWN0IHdzX3NlcnZlbnQpIC0gc2l6ZW9mKHN0cnVjdCBzZXJ2ZW50KSk7IH0KKyAgIH0KKyAgIHJldHVybiBzaXplOworfQorCit2b2lkIGZpeHVwX3dzc2Uoc3RydWN0IHdzX3NlcnZlbnQqIHBfd3NzZSwgU0VHUFRSIGJhc2UpCit7CisgICBpbnQgaTsKKyAgIHVuc2lnbmVkKiAgICAgICBwX2FsaWFzZXMgPSAodW5zaWduZWQqKSgoY2hhciopcF93c3NlICsgKHVuc2lnbmVkKXBfd3NzZS0+c19hbGlhc2VzKTsKKyAgICgodW5zaWduZWQpKHBfd3NzZS0+c19uYW1lKSkgKz0gKHVuc2lnbmVkKWJhc2U7CisgICAoKHBfd3NzZS0+c19wcm90bykpICs9ICh1bnNpZ25lZCliYXNlOworICAgKChwX3dzc2UtPnNfYWxpYXNlcykpICs9ICh1bnNpZ25lZCliYXNlOworICAgZm9yKGk9MDtwX2FsaWFzZXNbaV07aSsrKSBwX2FsaWFzZXNbaV0gKz0gKHVuc2lnbmVkKWJhc2U7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVycm9yIGhhbmRsaW5nICovCisKK1VJTlQxNiB3c2FFcnJubyh2b2lkKQoreworICAgIGludAlsb2NfZXJybm8gPSBlcnJubzsgCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyAgICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZXJyLCAid2luc29jazogZXJybm8gJWQsICglcykuXG4iLCAKKyAgICAgICAgICAgICAgICAJCQkgZXJybm8sIHN5c19lcnJsaXN0W2Vycm5vXSk7CisjZWxzZQorICAgICAgIGRwcmludGZfd2luc29jayhzdGRlcnIsICJ3aW5zb2NrOiBlcnJubyAlZFxuIiwgZXJybm8pOworI2VuZGlmCisKKyAgICBzd2l0Y2gobG9jX2Vycm5vKQorICAgIHsKKwljYXNlIEVJTlRSOgkJcmV0dXJuIFdTQUVJTlRSOworCWNhc2UgRUJBREY6CQlyZXR1cm4gV1NBRUJBREY7CisJY2FzZSBFQUNDRVM6CQlyZXR1cm4gV1NBRUFDQ0VTOworCWNhc2UgRUZBVUxUOgkJcmV0dXJuIFdTQUVGQVVMVDsKKwljYXNlIEVJTlZBTDoJCXJldHVybiBXU0FFSU5WQUw7CisJY2FzZSBFTUZJTEU6CQlyZXR1cm4gV1NBRU1GSUxFOworCWNhc2UgRVdPVUxEQkxPQ0s6CXJldHVybiBXU0FFV09VTERCTE9DSzsKKwljYXNlIEVJTlBST0dSRVNTOglyZXR1cm4gV1NBRUlOUFJPR1JFU1M7CisJY2FzZSBFQUxSRUFEWToJCXJldHVybiBXU0FFQUxSRUFEWTsKKwljYXNlIEVOT1RTT0NLOgkJcmV0dXJuIFdTQUVOT1RTT0NLOworCWNhc2UgRURFU1RBRERSUkVROglyZXR1cm4gV1NBRURFU1RBRERSUkVROworCWNhc2UgRU1TR1NJWkU6CQlyZXR1cm4gV1NBRU1TR1NJWkU7CisJY2FzZSBFUFJPVE9UWVBFOglyZXR1cm4gV1NBRVBST1RPVFlQRTsKKwljYXNlIEVOT1BST1RPT1BUOglyZXR1cm4gV1NBRU5PUFJPVE9PUFQ7CisJY2FzZSBFUFJPVE9OT1NVUFBPUlQ6CXJldHVybiBXU0FFUFJPVE9OT1NVUFBPUlQ7CisJY2FzZSBFU09DS1ROT1NVUFBPUlQ6CXJldHVybiBXU0FFU09DS1ROT1NVUFBPUlQ7CisJY2FzZSBFT1BOT1RTVVBQOglyZXR1cm4gV1NBRU9QTk9UU1VQUDsKKwljYXNlIEVQRk5PU1VQUE9SVDoJcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsKKwljYXNlIEVBRk5PU1VQUE9SVDoJcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsKKwljYXNlIEVBRERSSU5VU0U6CXJldHVybiBXU0FFQUREUklOVVNFOworCWNhc2UgRUFERFJOT1RBVkFJTDoJcmV0dXJuIFdTQUVBRERSTk9UQVZBSUw7CisJY2FzZSBFTkVURE9XTjoJCXJldHVybiBXU0FFTkVURE9XTjsKKwljYXNlIEVORVRVTlJFQUNIOglyZXR1cm4gV1NBRU5FVFVOUkVBQ0g7CisJY2FzZSBFTkVUUkVTRVQ6CQlyZXR1cm4gV1NBRU5FVFJFU0VUOworCWNhc2UgRUNPTk5BQk9SVEVEOglyZXR1cm4gV1NBRUNPTk5BQk9SVEVEOworCWNhc2UgRUNPTk5SRVNFVDoJcmV0dXJuIFdTQUVDT05OUkVTRVQ7CisJY2FzZSBFTk9CVUZTOgkJcmV0dXJuIFdTQUVOT0JVRlM7CisJY2FzZSBFSVNDT05OOgkJcmV0dXJuIFdTQUVJU0NPTk47CisJY2FzZSBFTk9UQ09OTjoJCXJldHVybiBXU0FFTk9UQ09OTjsKKwljYXNlIEVTSFVURE9XTjoJCXJldHVybiBXU0FFU0hVVERPV047CisJY2FzZSBFVE9PTUFOWVJFRlM6CXJldHVybiBXU0FFVE9PTUFOWVJFRlM7CisJY2FzZSBFVElNRURPVVQ6CQlyZXR1cm4gV1NBRVRJTUVET1VUOworCWNhc2UgRUNPTk5SRUZVU0VEOglyZXR1cm4gV1NBRUNPTk5SRUZVU0VEOworCWNhc2UgRUxPT1A6CQlyZXR1cm4gV1NBRUxPT1A7CisJY2FzZSBFTkFNRVRPT0xPTkc6CXJldHVybiBXU0FFTkFNRVRPT0xPTkc7CisJY2FzZSBFSE9TVERPV046CQlyZXR1cm4gV1NBRUhPU1RET1dOOworCWNhc2UgRUhPU1RVTlJFQUNIOglyZXR1cm4gV1NBRUhPU1RVTlJFQUNIOworCWNhc2UgRU5PVEVNUFRZOgkJcmV0dXJuIFdTQUVOT1RFTVBUWTsKKyNpZmRlZiBFUFJPQ0xJTQorCWNhc2UgRVBST0NMSU06CQlyZXR1cm4gV1NBRVBST0NMSU07CisjZW5kaWYKKyNpZmRlZiBFVVNFUlMKKwljYXNlIEVVU0VSUzoJCXJldHVybiBXU0FFVVNFUlM7CisjZW5kaWYKKyNpZmRlZiBFRFFVT1QKKwljYXNlIEVEUVVPVDoJCXJldHVybiBXU0FFRFFVT1Q7CisjZW5kaWYKKwljYXNlIEVTVEFMRToJCXJldHVybiBXU0FFU1RBTEU7CisJY2FzZSBFUkVNT1RFOgkJcmV0dXJuIFdTQUVSRU1PVEU7CisKKyAgICAgICAvKiBqdXN0IGluIGNhc2Ugd2UgZXZlciBnZXQgaGVyZSBhbmQgdGhlcmUgYXJlIG5vIHByb2JsZW1zICovCisJY2FzZSAwOgkJCXJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIndpbnNvY2s6IHVua25vd24gZXJybm8gJWQhXG4iLCBlcnJubyk7CisJCXJldHVybiBXU0FFT1BOT1RTVVBQOworICAgIH0KK30KKworVUlOVDE2IHdzYUhlcnJubyh2b2lkKQoreworICAgIGludAkJbG9jX2Vycm5vID0gaF9lcnJubzsKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCisgICAgZHByaW50Zl93aW5zb2NrKHN0ZGVyciwgIndpbnNvY2s6IGhfZXJybm8gJWQsICglcykuXG4iLCAKKyAgICAgICAgICAgICAgIAkgICAgaF9lcnJubywgc3lzX2Vycmxpc3RbaF9lcnJub10pOworI2Vsc2UKKyAgICBkcHJpbnRmX3dpbnNvY2soc3RkZXJyLCAid2luc29jazogaF9lcnJubyAlZC5cbiIsIGhfZXJybm8pOworI2lmbmRlZiBzdW4KKyAgICBpZiggZGVidWdnaW5nX3dpbnNvY2sgKSAgaGVycm9yKCJ3aW5lOiB3aW5zb2NrOiB3c2FoZXJybm8iKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBzd2l0Y2gobG9jX2Vycm5vKQorICAgIHsKKwljYXNlIEhPU1RfTk9UX0ZPVU5EOglyZXR1cm4gV1NBSE9TVF9OT1RfRk9VTkQ7CisJY2FzZSBUUllfQUdBSU46CQlyZXR1cm4gV1NBVFJZX0FHQUlOOworCWNhc2UgTk9fUkVDT1ZFUlk6CXJldHVybiBXU0FOT19SRUNPVkVSWTsKKwljYXNlIE5PX0RBVEE6CQlyZXR1cm4gV1NBTk9fREFUQTsgCisKKwljYXNlIDA6CQkJcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAid2luc29jazogdW5rbm93biBoX2Vycm5vICVkIVxuIiwgaF9lcnJubyk7CisJCXJldHVybiBXU0FFT1BOT1RTVVBQOworICAgIH0KK30KKworCmRpZmYgLS1naXQgYS9taXNjL3dpbnNvY2tfYXN5bmMuYyBiL21pc2Mvd2luc29ja19hc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTZiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL3dpbnNvY2tfYXN5bmMuYwpAQCAtMCwwICsxLDQ4NiBAQAorLyoKKyAqIGFzeW5jaHJvbm91cyB3aW5zb2NrIHNlcnZpY2VzCisgKiAKKyAqIChDKSAxOTk2IEFsZXggS29yb2JrYS4KKyAqCisgKiBGSVhNRTogdGVsZnRwMTYgKGZ0cCBwYXJ0KSBzdGFsbHMgb24gQXN5bmNTZWxlY3Qgd2l0aCBGRF9BQ0NFUFQuCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5zb2NrLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2RlZmluZSBfX1dTX0FTWU5DX0RFQlVHCTAKKworc3RhdGljIGludAkJX2FzeW5jX2lvX21heF9mZCA9IDA7CitzdGF0aWMgZmRfc2V0CQlfX2FzeW5jX2lvX2Zkc2V0Oworc3RhdGljIHdzX2FzeW5jX29wKglfX2FzeW5jX29wX2xpc3QgPSBOVUxMOworCitleHRlcm4gd3NfYXN5bmNfY3RsCWFzeW5jX2N0bDsKK2V4dGVybiBpbnQJCWFzeW5jX3FpZDsKKworZmRfc2V0CQkgZmRfcmVhZCwgZmRfd3JpdGUsIGZkX2V4Y3A7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzeW5jL25vbi1ibG9ja2luZyBJL08gKi8KKworaW50IFdJTlNPQ0tfYXN5bmNfaW8oaW50IGZkLCBpbnQgYXN5bmMpCit7CisgICAgaW50IGZkX2ZsYWdzOworCisgICAgZmNudGwoZmQsIEZfU0VUT1dOLCBnZXRwaWQoKSk7CisKKyAgICBmZF9mbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKyAgICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIChhc3luYyk/IGZkX2ZsYWdzIHwgRkFTWU5DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZF9mbGFncyAmIH5GQVNZTkMgKSAhPSAtMSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgV0lOU09DS191bmJsb2NrX2lvKGludCBmZCwgaW50IG5vYmxvY2spCit7CisgICAgaW50IGZkX2ZsYWdzOworCisgICAgZmRfZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisgICAgaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCAobm9ibG9jayk/IGZkX2ZsYWdzIHwgIE9fTk9OQkxPQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmRfZmxhZ3MgJiB+T19OT05CTE9DSyApICE9IC0xKSByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBXSU5TT0NLX2NoZWNrX2FzeW5jX29wKHdzX2FzeW5jX29wKiBwX2FvcCkKK3sKKyAgd3NfYXN5bmNfb3AqICAgcCA9IF9fYXN5bmNfb3BfbGlzdDsKKyAgd2hpbGUoIHAgKSBpZiggcCA9PSBwX2FvcCApIHJldHVybiAxOworCSAgICAgZWxzZSBwID0gcC0+bmV4dDsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgV0lOU09DS19jYW5jZWxfYXN5bmNfb3AoSFRBU0sxNiBoVGFzaykKK3sKKyAgd3NfYXN5bmNfb3AqICAgcCA9IF9fYXN5bmNfb3BfbGlzdDsKKyAgd2hpbGUoIHAgKSAKKyAgICAgaWYoaFRhc2sgPT0gR2V0V2luZG93VGFzazE2KHAtPmhXbmQpKSAKKyAgICAgICAgcC0+ZmxhZ3MgPSAwOworfQorCit2b2lkIFdJTlNPQ0tfbGlua19hc3luY19vcCh3c19hc3luY19vcCogcF9hb3ApCit7CisgIGlmKCBfX2FzeW5jX29wX2xpc3QgKSBfX2FzeW5jX29wX2xpc3QtPnByZXYgPSBwX2FvcDsKKyAgZWxzZSBGRF9aRVJPKCZfX2FzeW5jX2lvX2Zkc2V0KTsKKworICBwX2FvcC0+bmV4dCA9IF9fYXN5bmNfb3BfbGlzdDsgCisgIHBfYW9wLT5wcmV2ID0gTlVMTDsKKyAgX19hc3luY19vcF9saXN0ID0gcF9hb3A7CisKKyAgRkRfU0VUKHBfYW9wLT5mZFswXSwgJl9fYXN5bmNfaW9fZmRzZXQpOworICBpZiggcF9hb3AtPmZkWzBdID4gX2FzeW5jX2lvX21heF9mZCApIAorCQkgICAgIF9hc3luY19pb19tYXhfZmQgPSBwX2FvcC0+ZmRbMF07Cit9CisKK3ZvaWQgV0lOU09DS191bmxpbmtfYXN5bmNfb3Aod3NfYXN5bmNfb3AqIHBfYW9wKQoreworICBpZiggcF9hb3AgPT0gX19hc3luY19vcF9saXN0ICkgX19hc3luY19vcF9saXN0ID0gcF9hb3AtPm5leHQ7CisgIGVsc2UKKyAgeyBwX2FvcC0+cHJldi0+bmV4dCA9IHBfYW9wLT5uZXh0OworICAgIGlmKCBwX2FvcC0+bmV4dCApIHBfYW9wLT5uZXh0LT5wcmV2ID0gcF9hb3AtPnByZXY7IH0KKyAgRkRfQ0xSKHBfYW9wLT5mZFswXSwgJl9fYXN5bmNfaW9fZmRzZXQpOyAKKyAgaWYoIHBfYW9wLT5mZFswXSA9PSBfYXN5bmNfaW9fbWF4X2ZkICkKKwkJICAgICAgX2FzeW5jX2lvX21heF9mZC0tOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTSUdJTyBoYW5kbGVyIC0KKyAqCisgKiBsaW5rX2FzeW5jX29wL3VubGlua19hc3luY19vcCBhbGxvdyB0byBpbnN0YWxsIGdlbmVyaWMKKyAqIGFzeW5jIElPIGhhbmRsZXJzIChwcm92aWRlZCB0aGF0IGFvcF9jb250cm9sIGZ1bmN0aW9uIGlzIGRlZmluZWQpLgorICoKKyAqIE5vdGU6IEFzeW5jR2V0WGJ5WSBleHBpbGljaXRseSByYWlzZSBpdC4KKyAqLworCit2b2lkIFdJTlNPQ0tfc2lnaW8oaW50IHNpZ25hbCkKK3sKKyBzdHJ1Y3QgdGltZXZhbCAgICAgICAgIHRpbWVvdXQ7CisgZmRfc2V0ICAgICAgICAgICAgICAgICBjaGVja19zZXQ7Cisgd3NfYXN5bmNfb3AqCQlwX2FvcDsKKworIGNoZWNrX3NldCA9IF9fYXN5bmNfaW9fZmRzZXQ7CisgYnplcm8oJnRpbWVvdXQsc2l6ZW9mKHRpbWVvdXQpKTsKKworIHdoaWxlKCBzZWxlY3QoX2FzeW5jX2lvX21heF9mZCArIDEsCisgICAgICAgICAgICAgICZjaGVja19zZXQsIE5VTEwsIE5VTEwsICZ0aW1lb3V0KSA+IDApCisgeworICAgZm9yKCBwX2FvcCA9IF9fYXN5bmNfb3BfbGlzdDsKKwlwX2FvcCA7IHBfYW9wID0gcF9hb3AtPm5leHQgKQorICAgICAgaWYoIEZEX0lTU0VUKHBfYW9wLT5mZFswXSwgJmNoZWNrX3NldCkgKQorICAgICAgICAgIGlmKCBwX2FvcC0+YW9wX2NvbnRyb2wocF9hb3AsIEFPUF9JTykgPT0gQU9QX0NPTlRST0xfUkVNT1ZFICkKKwkgIHsKKwkgICAgICBpZiggcF9hb3AtPnBpZCApIAorCSAgICAgIHsgCisJCWtpbGwocF9hb3AtPnBpZCwgU0lHS0lMTCk7CisJCXdhaXRwaWQocF9hb3AtPnBpZCwgTlVMTCwgMCk7ICAKKwkgICAgICB9CisJICAgICAgV0lOU09DS191bmxpbmtfYXN5bmNfb3AoIHBfYW9wICk7CisJICB9CisgICBjaGVja19zZXQgPSBfX2FzeW5jX2lvX2Zkc2V0OworICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNoaWxkIHByb2Nlc3MgSVBDICovCisKK3N0YXRpYyB2b2lkIF9zaWd1c3IxX2hhbmRsZXJfY2hpbGQoaW50IHNpZykKK3sKKyAgIC8qIHJlYWQgbWVzc2FnZSBxdWV1ZSB0byBkZWNpZGUgd2hpY2gKKyAgICAqIGFzeW5jX2N0bCBwYXJhbWV0ZXJzIHRvIHVwZGF0ZSAKKyAgICAqCisgICAgKiBOb3RlOiB3ZSBkb24ndCB3YW50IHRvIGhhdmUgU0FfUkVTVEFSVCBvbiB0aGlzIHNpZ25hbAorICAgICogaGFuZGxlciwgb3RoZXJ3aXNlIHNlbGVjdCgpIHdvbid0IG5vdGljZSBjaGFuZ2VkIGZkIHNldHMuCisgICAgKi8KKworICAgc2lnbmFsKCBTSUdVU1IxLCBfc2lndXNyMV9oYW5kbGVyX2NoaWxkICk7CisgICB3aGlsZSggbXNncmN2KGFzeW5jX3FpZCwgKHN0cnVjdCBtc2didWYqKSZhc3luY19jdGwuaXAsCisgICAgICAgICAgTVRZUEVfUEFSRU5UX1NJWkUsIE1UWVBFX1BBUkVOVCwgSVBDX05PV0FJVCkgIT0gLTEgKQorICAgeworICAgICAgIC8qIG9ubHkgaXAubFBhcmFtIGlzIHVwZGF0ZWQgKi8KKyNpZiBfX1dTX0FTWU5DX0RFQlVHCisgICAgICAgcHJpbnRmKCJoYW5kbGVyIC0gZXZlbnQgJTA4eFxuIiwgYXN5bmNfY3RsLmlwLmxQYXJhbSApOworI2VuZGlmCisKKyAgICAgICBzd2l0Y2goIGFzeW5jX2N0bC5pcC5sUGFyYW0gKQorICAgICAgIHsKKwkgIC8qIFRoZXNlIGFyZSBldmVudHMgd2UgYXJlIG5vdGlmaWVkIG9mLgorCSAgICovCisKKyAgICAgICAgICBjYXNlICAgV1NfRkRfQ09OTkVDVEVEOiBhc3luY19jdGwubEV2ZW50ICY9IH5XU19GRF9DT05ORUNUOworCQkJCSAgRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3JlYWQpOworCQkJCSAgRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKTsKKwkJCSAgCSAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlICAgV1NfRkRfQUNDRVBUOiAgYXN5bmNfY3RsLndzX3NvY2stPmZsYWdzIHw9IFdTX0ZEX0FDQ0VQVDsKKwkJCQlGRF9TRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEX1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF93cml0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgICBXU19GRF9PT0I6ICAgICBhc3luY19jdGwubEV2ZW50IHw9IFdTX0ZEX09PQjsKKwkJCQlGRF9TRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfZXhjcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgICBXU19GRF9SRUFEOiAgICBhc3luY19jdGwubEV2ZW50IHw9IFdTX0ZEX1JFQUQ7CisJCQkJRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlICAgV1NfRkRfV1JJVEU6ICAgYXN5bmNfY3RsLmxFdmVudCB8PSBXU19GRF9XUklURTsKKwkJCQlGRF9TRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfd3JpdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgIH0KKyAgIH0KK30KKworc3RhdGljIGludCBub3RpZnlfcGFyZW50KCB1bnNpZ25lZCBmbGFnICkKK3sKKyAgaWYoIGZsYWcgJiBXU01TR19BU1lOQ19TRUxFQ1QgKQorICB7CisgICAgIGFzeW5jX2N0bC5pcC5tdHlwZSA9IE1UWVBFX0NMSUVOVDsKKyAgICAgd2hpbGUoIG1zZ3NuZChhc3luY19xaWQsIChzdHJ1Y3QgbXNnYnVmKikmKGFzeW5jX2N0bC5pcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRZUEVfQ0xJRU5UX1NJWkUsIDApID09IC0xICkKKyAgICAgeworICAgICAgIGlmKCBlcnJubyA9PSBFSU5UUiApIGNvbnRpbnVlOworICAgICAgIGVsc2UgaWYoIGVycm5vID09IEVJRFJNICkgX2V4aXQoMCk7CisgICAgICAgZWxzZSAKKyAgICAgICB7IAorCSBwZXJyb3IoIkFzeW5jU2VsZWN0KGNoaWxkKSIpOyAKKwkgcmV0dXJuIDA7IAorICAgICAgIH0KKyAgICAgfQorICAgICBraWxsKGdldHBwaWQoKSwgU0lHVVNSMSk7IAorCisjaWYgX19XU19BU1lOQ19ERUJVRworICBwcmludGYoImhhbmRsZXIgLSBub3RpZnkgWyUwOHhdXG4iLCBhc3luY19jdGwuaXAubFBhcmFtKTsKKyNlbmRpZgorICB9CisgIGVsc2UgLyogdXNlIGhhbGYtZHVwbGV4IHBpcGUgdG8gaGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBwYWNrZXRzICovCisgIHsKKyAgICAgd3JpdGUoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMV0sICZhc3luY19jdGwubExlbmd0aCwgc2l6ZW9mKHVuc2lnbmVkKSApOworICAgICB3cml0ZShhc3luY19jdGwud3NfYW9wLT5mZFsxXSwgYXN5bmNfY3RsLmJ1ZmZlciwgYXN5bmNfY3RsLmxMZW5ndGggKTsKKyAgICAga2lsbChnZXRwcGlkKCksIFNJR0lPKTsgICAgLyogc2ltdWxhdGUgYXN5bmMgSS9PICovCisjaWYgX19XU19BU1lOQ19ERUJVRworICBwcmludGYoImhhbmRsZXIgLSBub3RpZnkgYW9wIFslZCwgYnVmICVkXVxuIiwgYXN5bmNfY3RsLmxMZW5ndGgsIGFzeW5jX2N0bC53c19hb3AtPmJ1Zmxlbik7CisjZW5kaWYKKyAgICAgcGF1c2UoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXN5bmMgc2VsZWN0ICovCisKK3N0YXRpYyB2b2lkIHNldHVwX2ZkX3NldHMoKQoreworICAgRkRfWkVSTygmZmRfcmVhZCk7IEZEX1pFUk8oJmZkX3dyaXRlKTsgRkRfWkVSTygmZmRfZXhjcCk7CisKKyAgIGlmKCBhc3luY19jdGwubEV2ZW50ICYgV1NfRkRfT09CKSAKKyAgICAgICBGRF9TRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfZXhjcCk7CisgICBpZiggYXN5bmNfY3RsLmxFdmVudCAmIChXU19GRF9BQ0NFUFQgfCBXU19GRF9SRUFEIHwKKwkJCSAgIFdTX0ZEX0NPTk5FQ1QgfCBXU19GRF9DTE9TRSkgKSAKKyAgICAgICBGRF9TRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCk7CisgICBpZiggYXN5bmNfY3RsLmxFdmVudCAmIChXU19GRF9XUklURSB8IFdTX0ZEX0NPTk5FQ1QpICkgCisgICAgICAgRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfc2lnX3NldHMoc2lnc2V0X3QqIHNpZ19ibG9jaykKK3sKKyAgIHNpZ2VtcHR5c2V0KHNpZ19ibG9jayk7CisgICBzaWdhZGRzZXQoc2lnX2Jsb2NrLCBTSUdVU1IxKTsKKyAgIHNpZ3Byb2NtYXNrKCBTSUdfQkxPQ0ssIHNpZ19ibG9jaywgTlVMTCk7CisgICBzaWduYWwoIFNJR1VTUjEsIF9zaWd1c3IxX2hhbmRsZXJfY2hpbGQgKTsKK30KKwordm9pZCBXSU5TT0NLX2RvX2FzeW5jX3NlbGVjdCgpCit7CisgIHNpZ3NldF90ICAgIHNpZ19ibG9jazsKKyAgaW50CSAgICAgIGJ5dGVzOworCisgIHNldHVwX3NpZ19zZXRzKCZzaWdfYmxvY2spOworICBzZXR1cF9mZF9zZXRzKCk7CisKKyAgd2hpbGUoMSkKKyAgeworICAgIGludAkJdmFsOworCisgICAgc2lncHJvY21hc2soIFNJR19VTkJMT0NLLCAmc2lnX2Jsb2NrLCBOVUxMKTsgCisKKyNpZiBfX1dTX0FTWU5DX0RFQlVHCisgICAgcHJpbnRmKCJzZWxlY3QoMilbJWksJWksJWldLi4uICIsIAorCSAgICAgRkRfSVNTRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCksCisJICAgICBGRF9JU1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF93cml0ZSksCisJICAgICBGRF9JU1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF9leGNwKSk7CisjZW5kaWYKKyAgICBpZiggKHZhbCA9IHNlbGVjdChhc3luY19jdGwud3Nfc29jay0+ZmQgKyAxLCAKKwkJICAgICAmZmRfcmVhZCwgJmZkX3dyaXRlLCAmZmRfZXhjcCwgTlVMTCkpID09IC0xICkKKyAgICAgIGlmKCBlcnJubyA9PSBFSU5UUiApIGNvbnRpbnVlOworI2lmIF9fV1NfQVNZTkNfREVCVUcKKyAgICBwcmludGYoImdvdCAlaSBldmVudHNcbiIsIHZhbCk7CisjZW5kaWYKKworI2lmIF9fV1NfQVNZTkNfREVCVUcKKyAgICBpZiggRkRfSVNTRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCkgKQorCXByaW50ZigiaGFuZGxlciAtIHJlYWQgaXMgUkVBRFkhIFslMDh4XVxuIiwgYXN5bmNfY3RsLmxFdmVudCAmIChXU19GRF9SRUFEIHwgV1NfRkRfQ0xPU0UpKTsKKyNlbmRpZgorCisgICAgc2lncHJvY21hc2soIFNJR19CTE9DSywgJnNpZ19ibG9jaywgTlVMTCk7CisgICAgYXN5bmNfY3RsLmlwLmxQYXJhbSA9IDA7CisgICAgaWYoIGFzeW5jX2N0bC53c19zb2NrLT5mbGFncyAmIFdTX0ZEX0FDQ0VQVCApCisgICAgeworCS8qIGxpc3RlbmluZyBzb2NrZXQgKi8KKwkKKwlGRF9DTFIoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCk7CisJRkRfQ0xSKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKTsKKworCWFzeW5jX2N0bC5pcC5sUGFyYW0gPSBXU0FNQUtFU0VMRUNUUkVQTFkoIFdTX0ZEX0FDQ0VQVCwgMCApOworICAgICAgICBub3RpZnlfcGFyZW50KCBXU01TR19BU1lOQ19TRUxFQ1QgKTsKKwljb250aW51ZTsKKyAgICB9CisgICAgZWxzZSAvKiBJL08gc29ja2V0ICovCisgICAgeworCWlmKCBhc3luY19jdGwubEV2ZW50ICYgV1NfRkRfQ09OTkVDVCApCisJeworCSAgaWYoIEZEX0lTU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKSApIAorCSAgeworCSAgICAgIC8qIHN1Y2Nlc3MgLSByZWluaXQgZmQgc2V0cyB0byBzdGFydCBJL08gKi8KKworCSAgICAgIGlmKCBhc3luY19jdGwubEV2ZW50ICYgKFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSkpCisJCSAgIEZEX1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF9yZWFkKTsKKwkgICAgICBlbHNlIEZEX0NMUihhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF9yZWFkKTsKKwkgICAgICBpZiggYXN5bmNfY3RsLmxFdmVudCAmIFdTX0ZEX1dSSVRFICkKKwkJICAgRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKTsKKwkgICAgICBlbHNlIEZEX0NMUihhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF93cml0ZSk7CisKKwkgICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9DT05ORUNULCAwICk7CisJICAgICAgYXN5bmNfY3RsLmxFdmVudCAmPSB+V1NfRkRfQ09OTkVDVDsgLyogb25lLXNob3QgKi8KKwkgIH0KKwkgIGVsc2UgaWYoIEZEX0lTU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3JlYWQpICkKKwkgIHsKKyAgICAgICAgICAgICAgLyogZmFpbHVyZSAtIGRvIHJlYWQoKSB0byBnZXQgY29ycmVjdCBlcnJubyAqLworCisgICAgICAgICAgICAgIGlmKCByZWFkKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmJ5dGVzLCA0KSA9PSAtMSApCisgICAgICAgICAgICAgICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9DT05ORUNULCB3c2FFcnJubygpICk7CisgICAgICAgICAgICAgIGVsc2UgY29udGludWU7CisJICB9IGVsc2UgY29udGludWU7IC8qIE9PQj8/ICovCisKKyAgICAgICAgICBub3RpZnlfcGFyZW50KCBXU01TR19BU1lOQ19TRUxFQ1QgKTsKKwl9CisJZWxzZSAvKiBjb25uZWN0ZWQgc29ja2V0ICovCisJeworCisJICBpZiggYXN5bmNfY3RsLmxFdmVudCAmIFdTX0ZEX09PQiApCisJICAgIGlmKCBGRF9JU1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF9leGNwKSApCisJICAgIHsKKwkgICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9PT0IsIDAgKTsKKwkgICAgICBhc3luY19jdGwubEV2ZW50ICY9IH5XU19GRF9PT0I7CisJICAgICAgRkRfQ0xSKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX2V4Y3ApOworCSAgICAgIG5vdGlmeV9wYXJlbnQoIFdTTVNHX0FTWU5DX1NFTEVDVCApOworCSAgICB9CisJICAgIGVsc2UgRkRfU0VUKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX2V4Y3ApOworCisgICAgICAgICAgaWYoIGFzeW5jX2N0bC5sRXZlbnQgJiBXU19GRF9XUklURSApCisgICAgICAgICAgICBpZiggRkRfSVNTRVQoIGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9XUklURSwgMCApOworICAgICAgICAgICAgICBhc3luY19jdGwubEV2ZW50ICY9IH5XU19GRF9XUklURTsKKyAgICAgICAgICAgICAgRkRfQ0xSKGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3dyaXRlKTsKKyAgICAgICAgICAgICAgbm90aWZ5X3BhcmVudCggV1NNU0dfQVNZTkNfU0VMRUNUICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIEZEX1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF93cml0ZSk7CisKKwkgIGlmKCBhc3luY19jdGwubEV2ZW50ICYgKFdTX0ZEX1JFQUQgfCBXU19GRF9DTE9TRSkgKQorCSAgICBpZiggRkRfSVNTRVQoYXN5bmNfY3RsLndzX3NvY2stPmZkLCAmZmRfcmVhZCkgKQorCSAgICB7CisJICAgICAgaWYoIGlvY3RsKCBhc3luY19jdGwud3Nfc29jay0+ZmQsIEZJT05SRUFELCAoY2hhciopJmJ5dGVzKSAhPSAtMSApCisJICAgICAgeworCSAgICAgICAgaWYoIGJ5dGVzICkJLyogZ290IGRhdGEgKi8KKwkgICAgICAgIHsKKyNpZiBfX1dTX0FTWU5DX0RFQlVHCisJCSAgcHJpbnRmKCJcdCVpIGJ5dGVzIHBlbmRpbmdcbiIsIGJ5dGVzICk7CisjZW5kaWYKKwkJICBpZiggYXN5bmNfY3RsLmxFdmVudCAmIFdTX0ZEX1JFQUQgKQorCQkgIHsKKwkJICAgICBhc3luY19jdGwuaXAubFBhcmFtID0gV1NBTUFLRVNFTEVDVFJFUExZKCBXU19GRF9SRUFELCAwICk7CisJCSAgICAgYXN5bmNfY3RsLmxFdmVudCAmPSB+V1NfRkRfUkVBRDsKKwkJICAgICBpZiggIShhc3luY19jdGwubEV2ZW50ICYgV1NfRkRfQ0xPU0UpICkgCisJCQkgICBGRF9DTFIoIGFzeW5jX2N0bC53c19zb2NrLT5mZCwgJmZkX3JlYWQgKTsKKwkJICB9CisJCSAgZWxzZSBpZiggIShhc3luY19jdGwubEV2ZW50ICYgKFdTX0ZEX1dSSVRFIHwgV1NfRkRfT09CKSkgKSAKKwkJICAgICAgIHsKKwkJCSAgc2lncHJvY21hc2soIFNJR19VTkJMT0NLLCAmc2lnX2Jsb2NrLCBOVUxMKTsKKwkJCSAgcGF1c2UoKTsKKwkJCSAgc2lncHJvY21hc2soIFNJR19CTE9DSywgJnNpZ19ibG9jaywgTlVMTCk7CisJCSAgICAgICB9CisJCSAgICAgICBlbHNlIGNvbnRpbnVlOworCSAgICAgICAgfQorCSAgICAgICAgZWxzZQkJLyogMCBieXRlcyB0byByZWFkICovCisJICAgICAgICB7CisJCSAgdmFsID0gcmVhZCggYXN5bmNfY3RsLndzX3NvY2stPmZkLCAoY2hhciopJmJ5dGVzLCA0KTsKKwkgICAgICAgICAgaWYoIGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVJTlRSICkgCisJCSAgeyAKKyNpZiBfX1dTX0FTWU5DX0RFQlVHCisJCSAgICBwcmludGYoIlx0d291bGQgYmxvY2suLlxuIik7CisjZW5kaWYKKwkJICAgIGNvbnRpbnVlOworCQkgIH0KKwkJICBzd2l0Y2goIHZhbCApCisJCSAgeworCQkgICAgY2FzZSAgMDogZXJybm8gPSBFTkVURE9XTjsJLyogRU5FVERPV04gKi8KKwkJICAgIGNhc2UgLTE6IAkJCS8qIEVDT05OUkVTRVQgKi8KKwkJCSAgICAgYXN5bmNfY3RsLmlwLmxQYXJhbSA9IFdTQU1BS0VTRUxFQ1RSRVBMWSggV1NfRkRfQ0xPU0UsIHdzYUVycm5vKCkgKTsKKwkJCSAgICAgYnJlYWs7CisJCSAgICBkZWZhdWx0OiBjb250aW51ZTsKKwkJICB9CisJCSAgYXN5bmNfY3RsLmxFdmVudCAmPSB+KFdTX0ZEX0NMT1NFIHwgV1NfRkRfUkVBRCk7IC8qIG9uZS1zaG90ICovCisJCSAgRkRfWkVSTygmZmRfcmVhZCk7IEZEX1pFUk8oJmZkX3dyaXRlKTsgCisJICAgICAgICB9CisJICAgICAgfQorCSAgICAgIGVsc2UgYXN5bmNfY3RsLmlwLmxQYXJhbSA9IFdTQU1BS0VTRUxFQ1RSRVBMWSggV1NfRkRfUkVBRCwgd3NhRXJybm8oKSApOworCisJICAgICAgbm90aWZ5X3BhcmVudCggV1NNU0dfQVNZTkNfU0VMRUNUICk7CisJICB9CisJICBlbHNlIEZEX1NFVChhc3luY19jdGwud3Nfc29jay0+ZmQsICZmZF9yZWFkKTsKKworCX0gLyogY29ubmVjdGVkIHNvY2tldCAqLworICAgIH0gLyogSS9PIHNvY2tldCAqLworICB9IC8qIHdoaWxlICovCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0WGJ5WSByZXF1ZXN0cyAqLworCitzdGF0aWMgdm9pZCBfYXN5bmNfZmFpbCgpCit7CisgICAgIGFzeW5jX2N0bC5sTGVuZ3RoID0KKyAgICAgICAgKGhfZXJybm8gPCAwKSA/ICh1bnNpZ25lZClXU0FNQUtFQVNZTkNSRVBMWSggMCwgd3NhRXJybm8oKSApCisgICAgICAgICAgICAgICAgICAgICAgOiAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIDAsIHdzYUhlcnJubygpICk7CisgICAgIHdyaXRlKGFzeW5jX2N0bC53c19hb3AtPmZkWzFdLCAmYXN5bmNfY3RsLmxMZW5ndGgsIHNpemVvZih1bnNpZ25lZCkgKTsKKyAgICAga2lsbChnZXRwcGlkKCksIFNJR0lPKTsgICAgLyogc2ltdWxhdGUgYXN5bmMgSS9PICovCisgICAgIHBhdXNlKCk7Cit9CisKK3ZvaWQgZHVtcF93c19ob3N0ZW50X29mZnNldChzdHJ1Y3Qgd3NfaG9zdGVudCogd3NoZSkKK3sKKyAgaW50CQlpOworICBjaGFyKgkJYmFzZSA9IChjaGFyKil3c2hlOworICB1bnNpZ25lZCoJcHRyOworCisgIHByaW50ZigiaF9uYW1lID0gJTA4eFx0WyVzXVxuIiwgKHVuc2lnbmVkKXdzaGUtPmhfbmFtZSwgYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX25hbWUpOworICBwcmludGYoImhfYWxpYXNlcyA9ICUwOHhcdFslMDh4XVxuIiwgKHVuc2lnbmVkKXdzaGUtPmhfYWxpYXNlcywgCisJCQkJICAgICAgICh1bnNpZ25lZCkoYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX2FsaWFzZXMpKTsKKyAgcHRyID0gKHVuc2lnbmVkKikoYmFzZSArICh1bnNpZ25lZCl3c2hlLT5oX2FsaWFzZXMpOworICBmb3IoaSA9IDA7IHB0cltpXTsgaSsrICkKKyAgeworCXByaW50ZigiJWkgLSAlMDh4ICIsIGkgKyAxLCBwdHJbaV0pOworCXByaW50ZigiIFslc11cbiIsICgoY2hhciopYmFzZSkgKyBwdHJbaV0pOworICB9CisgIHByaW50ZigiaF9sZW5ndGggPSAlaVxuIiwgd3NoZS0+aF9sZW5ndGgpOworfQorCit2b2lkIFdTX2RvX2FzeW5jX2dldGhvc3QoTFBXU0lORk8gcHdzaSwgdW5zaWduZWQgZmxhZyApCit7ICAKKyAgaW50CQkJc2l6ZSA9IDA7CisgIHN0cnVjdCBob3N0ZW50KiAJcF9oZTsKKworICBjbG9zZShhc3luY19jdGwud3NfYW9wLT5mZFswXSk7CisgIHBfaGUgPSAoZmxhZyAmIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUpCisJID8gZ2V0aG9zdGJ5bmFtZShhc3luY19jdGwud3NfYW9wLT5pbml0KQorCSA6IGdldGhvc3RieWFkZHIoYXN5bmNfY3RsLndzX2FvcC0+aW5pdCwKKwkJIAkgYXN5bmNfY3RsLmxMZW5ndGgsIGFzeW5jX2N0bC5sRXZlbnQpOworICBpZiggcF9oZSApIHNpemUgPSBXU19kdXBfaGUocHdzaSwgcF9oZSwgV1NfRFVQX1NFR1BUUiB8IFdTX0RVUF9PRkZTRVQgKTsKKyAgaWYoIHNpemUgKQorICB7CisgICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwd3NpLT5idWZmZXI7CisgICAgIGFzeW5jX2N0bC5sTGVuZ3RoID0gKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAoVUlOVDE2KXNpemUsIDAgKTsKKyAgICAgbm90aWZ5X3BhcmVudCggZmxhZyApOworICB9CisgIGVsc2UgX2FzeW5jX2ZhaWwoKTsKKyAgX2V4aXQoMCk7Cit9CisKK3ZvaWQgV1NfZG9fYXN5bmNfZ2V0cHJvdG8oTFBXU0lORk8gcHdzaSwgdW5zaWduZWQgZmxhZyApCit7CisgIGludAkJCXNpemUgPSAwOworICBzdHJ1Y3QgcHJvdG9lbnQqCXBfcGU7CisKKyAgY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0pOworICBwX3BlID0gKGZsYWcgJiBXU01TR19BU1lOQ19QUk9UT0JZTkFNRSkKKwkgPyBnZXRwcm90b2J5bmFtZShhc3luY19jdGwud3NfYW9wLT5pbml0KQorCSA6IGdldHByb3RvYnludW1iZXIoYXN5bmNfY3RsLmxFdmVudCk7CisgIGlmKCBwX3BlICkgc2l6ZSA9IFdTX2R1cF9wZShwd3NpLCBwX3BlLCBXU19EVVBfU0VHUFRSIHwgV1NfRFVQX09GRlNFVCApOworICBpZiggc2l6ZSApCisgIHsKKyAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IHB3c2ktPmJ1ZmZlcjsKKyAgICAgYXN5bmNfY3RsLmxMZW5ndGggPSAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIChVSU5UMTYpc2l6ZSwgMCApOworICAgICBub3RpZnlfcGFyZW50KCBmbGFnICk7CisgIH0gCisgIGVsc2UgX2FzeW5jX2ZhaWwoKTsKKyAgX2V4aXQoMCk7Cit9CisKK3ZvaWQgV1NfZG9fYXN5bmNfZ2V0c2VydihMUFdTSU5GTyBwd3NpLCB1bnNpZ25lZCBmbGFnICkKK3sKKyAgaW50CQkJc2l6ZSA9IDA7CisgIHN0cnVjdCBzZXJ2ZW50KiAJcF9zZTsKKworICBjbG9zZShhc3luY19jdGwud3NfYW9wLT5mZFswXSk7CisgIHBfc2UgPSAoZmxhZyAmIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUUpCisJID8gZ2V0c2VydmJ5bmFtZShhc3luY19jdGwud3NfYW9wLT5pbml0LCBhc3luY19jdGwuYnVmZmVyKQorCSA6IGdldHNlcnZieXBvcnQoYXN5bmNfY3RsLmxFdmVudCwgYXN5bmNfY3RsLndzX2FvcC0+aW5pdCk7CisgIGlmKCBwX3NlICkgc2l6ZSA9IFdTX2R1cF9zZShwd3NpLCBwX3NlLCBXU19EVVBfU0VHUFRSIHwgV1NfRFVQX09GRlNFVCApOworICBpZiggc2l6ZSApCisgIHsKKyAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IHB3c2ktPmJ1ZmZlcjsKKyAgICAgYXN5bmNfY3RsLmxMZW5ndGggPSAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIChVSU5UMTYpc2l6ZSwgMCApOworICAgICBub3RpZnlfcGFyZW50KCBmbGFnICk7CisgIH0KKyAgZWxzZSBfYXN5bmNfZmFpbCgpOworICBfZXhpdCgwKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWlzYy93aW5zb2NrZXQuYyBiL21pc2Mvd2luc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDdhNWUuLjAwMDAwMDAKLS0tIGEvbWlzYy93aW5zb2NrZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OTcgKzAsMCBAQAotLyoKLSAqIGJhc2VkIG9uIFdpbmRvd3MgU29ja2V0cyAxLjEgc3BlY3MKLSAqIChmdHAubWljcm9zb2Z0LmNvbTovQWR2c3lzL3dpbnNvY2svc3BlYzExL1dJTlNPQ0suVFhUKQotICogCi0gKiAoQykgMTk5MywxOTk0IEpvaG4gQnJlemFrLCBFcmlrIEJvcy4KLSAqLwotIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL2lwYy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2lmIGRlZmluZWQoX19zdnI0X18pCi0jaW5jbHVkZSA8c3lzL2ZpbGlvLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL21zZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG5ldGRiLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlICJ3aW5zb2NrLmgiCi0jaW5jbHVkZSAiZ2xvYmFsLmgiCi0jaW5jbHVkZSAic3RkZGVidWcuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0jaWZkZWYgX1NDT19EUwotI2RlZmluZSBfSU9SIF9JT1NSCi0jZGVmaW5lIF9JT1cgX0lPU1cKLSNlbmRpZgotCi1zdGF0aWMgV09SRCB3c2FfZXJybm87Ci1zdGF0aWMgaW50IHdzYV9pbml0dGVkOwotc3RhdGljIGtleV90IHdpbmVfa2V5ID0gMDsKLXN0YXRpYyBGQVJQUk9DMTYgQmxvY2tGdW5jdGlvbjsKLXN0YXRpYyBmZF9zZXQgZmRfaW5fdXNlOwotCi1leHRlcm4gaW50IGhfZXJybm87Ci0KLXN0cnVjdCBpcGNfcGFja2V0IHsKLQlsb25nCW10eXBlOwotCUhBTkRMRTE2IGhhbmRsZTsKLQlIV05ECWhXbmQ7Ci0JV09SRAl3TXNnOwotCUxPTkcJbFBhcmFtOwotfTsKLQotI2lmbmRlZiBXSU5FTElCCi0jcHJhZ21hIHBhY2soMSkKLSNlbmRpZgotCi0jZGVmaW5lIFdJTlNPQ0tfTUFYX1NPQ0tFVFMJMjU2Ci0jZGVmaW5lIFdJTlNPQ0tfTUFYX1VEUERHCTEwMjQKLQotLyogd2UgYXJlIG91dCBieSB0d28gd2l0aCB0aGUgZm9sbG93aW5nLCBpcyBpdCBkdWUgdG8gYnl0ZSBhbGlnbm1lbnQ/Ci0gKiAjZGVmaW5lIElQQ19QQUNLRVRfU0laRSAoc2l6ZW9mKHN0cnVjdCBpcGNfcGFja2V0KSAtIHNpemVvZihsb25nKSkgCi0gKi8KLSNkZWZpbmUgSVBDX1BBQ0tFVF9TSVpFIChzaXplb2Yoc3RydWN0IGlwY19wYWNrZXQpIC0gc2l6ZW9mKGxvbmcpIC0gMikKLS8qI2RlZmluZSBNVFlQRSAweGIwYjBlYjA1Ki8KLSNkZWZpbmUgTVRZUEUgMHgzMGIwZWIwNQotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBXaW4xNiBvbmx5ICovCi0KLXN0cnVjdCBXSU5faG9zdGVudCAgewotCVNFR1BUUgloX25hbWUgV0lORV9QQUNLRUQ7CQkvKiBvZmZpY2lhbCBuYW1lIG9mIGhvc3QgKi8KLQlTRUdQVFIJaF9hbGlhc2VzIFdJTkVfUEFDS0VEOwkvKiBhbGlhcyBsaXN0ICovCi0JSU5UCWhfYWRkcnR5cGUgV0lORV9QQUNLRUQ7CQkvKiBob3N0IGFkZHJlc3MgdHlwZSAqLwotCUlOVAloX2xlbmd0aCBXSU5FX1BBQ0tFRDsJCS8qIGxlbmd0aCBvZiBhZGRyZXNzICovCi0JY2hhcgkqKmhfYWRkcl9saXN0IFdJTkVfUEFDS0VEOwkvKiBsaXN0IG9mIGFkZHJlc3NlcyBmcm9tIG5hbWUgc2VydmVyICovCi0JY2hhcgkqbmFtZXNbMl07Ci0JY2hhciAgICBob3N0bmFtZVsyMDBdOwotfTsKLQotc3RydWN0CVdJTl9wcm90b2VudCB7Ci0JU0VHUFRSCXBfbmFtZSBXSU5FX1BBQ0tFRDsJCS8qIG9mZmljaWFsIHByb3RvY29sIG5hbWUgKi8KLQlTRUdQVFIJcF9hbGlhc2VzIFdJTkVfUEFDS0VEOwkvKiBhbGlhcyBsaXN0ICovCi0JSU5UCXBfcHJvdG8gV0lORV9QQUNLRUQ7CQkvKiBwcm90b2NvbCAjICovCi19OwotCi1zdHJ1Y3QJV0lOX3NlcnZlbnQgewotCVNFR1BUUglzX25hbWUgV0lORV9QQUNLRUQ7CQkvKiBvZmZpY2lhbCBzZXJ2aWNlIG5hbWUgKi8KLQlTRUdQVFIJc19hbGlhc2VzIFdJTkVfUEFDS0VEOwkvKiBhbGlhcyBsaXN0ICovCi0JSU5UCXNfcG9ydCBXSU5FX1BBQ0tFRDsJCS8qIHBvcnQgIyAqLwotCVNFR1BUUglzX3Byb3RvIFdJTkVfUEFDS0VEOwkJLyogcHJvdG9jb2wgdG8gdXNlICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBXaW5Tb2NrX2ZkX3NldCB7Ci0JdV9zaG9ydCBmZF9jb3VudDsgICAgICAgICAgICAgICAvKiBob3cgbWFueSBhcmUgU0VUPyAqLwotCVNPQ0tFVCAgZmRfYXJyYXlbRkRfU0VUU0laRV07ICAgLyogYW4gYXJyYXkgb2YgU09DS0VUcyAqLwotfSBXaW5Tb2NrX2ZkX3NldDsKLSAgICAgICAgICAgICAgICAKLXN0cnVjdCBXaW5Tb2NrSGVhcCB7Ci0JY2hhcgludG9hX2J1ZmZlclszMl07Ci0KLQlzdHJ1Y3QJV0lOX2hvc3RlbnQgaG9zdGVudF9hZGRyOwotCXN0cnVjdAlXSU5faG9zdGVudCBob3N0ZW50X25hbWU7Ci0Jc3RydWN0CVdJTl9wcm90b2VudCBwcm90b2VudF9uYW1lOwotCXN0cnVjdAlXSU5fcHJvdG9lbnQgcHJvdG9lbnRfbnVtYmVyOwotCXN0cnVjdAlXSU5fc2VydmVudCBzZXJ2ZW50X25hbWU7Ci0Jc3RydWN0CVdJTl9zZXJ2ZW50IHNlcnZlbnRfcG9ydDsKLQotCXN0cnVjdAlXSU5faG9zdGVudCBXU0Fob3N0ZW50X2FkZHI7Ci0Jc3RydWN0CVdJTl9ob3N0ZW50IFdTQWhvc3RlbnRfbmFtZTsKLQlzdHJ1Y3QJV0lOX3Byb3RvZW50IFdTQXByb3RvZW50X25hbWU7Ci0Jc3RydWN0CVdJTl9wcm90b2VudCBXU0Fwcm90b2VudF9udW1iZXI7CQotCXN0cnVjdAlXSU5fc2VydmVudCBXU0FzZXJ2ZW50X25hbWU7Ci0Jc3RydWN0CVdJTl9zZXJ2ZW50IFdTQXNlcnZlbnRfcG9ydDsKLQkvKiA4SyBzY3JhdGNoIGJ1ZmZlciBmb3IgYWxpYXNlcyBhbmQgZnJpZW5kcyBhcmUgaG9wZWZ1bGx5IGVub3VnaCAqLwotCWNoYXIgc2NyYXRjaFs4MTkyXTsKLX07Ci1zdGF0aWMgc3RydWN0IFdpblNvY2tIZWFwICpIZWFwOwotc3RhdGljIEhHTE9CQUwxNiBIZWFwSGFuZGxlOwotI2lmbmRlZiBXSU5FTElCMzIKLXN0YXRpYyBpbnQgU2NyYXRjaFB0cjsKLSNlbmRpZgotCi0jaWZuZGVmIFdJTkVMSUIKLSNkZWZpbmUgR0VUX1NFR19QVFIoeCkJTUFLRUxPTkcoKGludCkoKGNoYXIqKSh4KS0oY2hhciopSGVhcCksCVwKLQkJCQkJCQlHbG9iYWxIYW5kbGVUb1NlbChIZWFwSGFuZGxlKSkKLSNlbHNlCi0jZGVmaW5lIEdFVF9TRUdfUFRSKHgpCSgoU0VHUFRSKXgpCi0jZW5kaWYKLQotI2lmbmRlZiBXSU5FTElCCi0jcHJhZ21hIHBhY2soNCkKLSNlbmRpZgotCi0jZGVmaW5lIGR1bXBfc29ja2FkZHIoYSkgXAotCWZwcmludGYoc3RkZXJyLCAic29ja2FkZHJfaW46IGZhbWlseSAlZCwgYWRkcmVzcyAlcywgcG9ydCAlZFxuIiwgXAotCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhKS0+c2luX2ZhbWlseSwgXAotCQkJaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopYSktPnNpbl9hZGRyKSwgXAotCQkJbnRvaHMoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhKS0+c2luX3BvcnQpKQotCi0jaWZuZGVmIFdJTkVMSUIzMgotc3RhdGljIHZvaWQgUmVzZXRTY3JhdGNoKCkKLXsKLQlTY3JhdGNoUHRyPTA7Ci19Ci0KLXN0YXRpYyB2b2lkICpzY3JhdGNoX2FsbG9jKGludCBzaXplKQotewotCWNoYXIgKnJldDsKLQlpZihTY3JhdGNoUHRyK3NpemUgPiBzaXplb2YoSGVhcC0+c2NyYXRjaCkpCi0JCXJldHVybiAwOwotCXJldCA9IEhlYXAtPnNjcmF0Y2ggKyBTY3JhdGNoUHRyOwotCVNjcmF0Y2hQdHIgKz0gc2l6ZTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgU0VHUFRSIHNjcmF0Y2hfc3RyZHVwKGNoYXIgKiBzKQotewotCWNoYXIgKnJldD1zY3JhdGNoX2FsbG9jKHN0cmxlbihzKSsxKTsKLQlzdHJjcHkocmV0LHMpOwotCXJldHVybiBHRVRfU0VHX1BUUihyZXQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBXT1JEIHdzYWVycm5vKHZvaWQpCi17Ci0jaWZkZWYgREVCVUdfV0lOU09DSwotI2lmbmRlZiBzdW4KLSNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid2luc29jazogZXJybm8gJWQsICglcykuXG4iLCAKLSAgICAgICAgICAgICAgICAJCQllcnJubywgc3lzX2Vycmxpc3RbZXJybm9dKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5zb2NrOiBlcnJubyAlZFxuIiwgZXJybm8pOwotI2VuZGlmCi0jZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid2luc29jazogZXJybm8gJWRcbiIsIGVycm5vKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICAgICAgc3dpdGNoKGVycm5vKQotICAgICAgICB7Ci0JY2FzZSBFSU5UUjoJCXJldHVybiBXU0FFSU5UUjsKLQljYXNlIEVCQURGOgkJcmV0dXJuIFdTQUVCQURGOwotCWNhc2UgRUFDQ0VTOgkJcmV0dXJuIFdTQUVBQ0NFUzsKLQljYXNlIEVGQVVMVDoJCXJldHVybiBXU0FFRkFVTFQ7Ci0JY2FzZSBFSU5WQUw6CQlyZXR1cm4gV1NBRUlOVkFMOwotCWNhc2UgRU1GSUxFOgkJcmV0dXJuIFdTQUVNRklMRTsKLQljYXNlIEVXT1VMREJMT0NLOglyZXR1cm4gV1NBRVdPVUxEQkxPQ0s7Ci0JY2FzZSBFSU5QUk9HUkVTUzoJcmV0dXJuIFdTQUVJTlBST0dSRVNTOwotCWNhc2UgRUFMUkVBRFk6CQlyZXR1cm4gV1NBRUFMUkVBRFk7Ci0JY2FzZSBFTk9UU09DSzoJCXJldHVybiBXU0FFTk9UU09DSzsKLQljYXNlIEVERVNUQUREUlJFUToJcmV0dXJuIFdTQUVERVNUQUREUlJFUTsKLQljYXNlIEVNU0dTSVpFOgkJcmV0dXJuIFdTQUVNU0dTSVpFOwotCWNhc2UgRVBST1RPVFlQRToJcmV0dXJuIFdTQUVQUk9UT1RZUEU7Ci0JY2FzZSBFTk9QUk9UT09QVDoJcmV0dXJuIFdTQUVOT1BST1RPT1BUOwotCWNhc2UgRVBST1RPTk9TVVBQT1JUOglyZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOwotCWNhc2UgRVNPQ0tUTk9TVVBQT1JUOglyZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOwotCWNhc2UgRU9QTk9UU1VQUDoJcmV0dXJuIFdTQUVPUE5PVFNVUFA7Ci0JY2FzZSBFUEZOT1NVUFBPUlQ6CXJldHVybiBXU0FFUEZOT1NVUFBPUlQ7Ci0JY2FzZSBFQUZOT1NVUFBPUlQ6CXJldHVybiBXU0FFQUZOT1NVUFBPUlQ7Ci0JY2FzZSBFQUREUklOVVNFOglyZXR1cm4gV1NBRUFERFJJTlVTRTsKLQljYXNlIEVBRERSTk9UQVZBSUw6CXJldHVybiBXU0FFQUREUk5PVEFWQUlMOwotCWNhc2UgRU5FVERPV046CQlyZXR1cm4gV1NBRU5FVERPV047Ci0JY2FzZSBFTkVUVU5SRUFDSDoJcmV0dXJuIFdTQUVORVRVTlJFQUNIOwotCWNhc2UgRU5FVFJFU0VUOgkJcmV0dXJuIFdTQUVORVRSRVNFVDsKLQljYXNlIEVDT05OQUJPUlRFRDoJcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsKLQljYXNlIEVDT05OUkVTRVQ6CXJldHVybiBXU0FFQ09OTlJFU0VUOwotCWNhc2UgRU5PQlVGUzoJCXJldHVybiBXU0FFTk9CVUZTOwotCWNhc2UgRUlTQ09OTjoJCXJldHVybiBXU0FFSVNDT05OOwotCWNhc2UgRU5PVENPTk46CQlyZXR1cm4gV1NBRU5PVENPTk47Ci0JY2FzZSBFU0hVVERPV046CQlyZXR1cm4gV1NBRVNIVVRET1dOOwotCWNhc2UgRVRPT01BTllSRUZTOglyZXR1cm4gV1NBRVRPT01BTllSRUZTOwotCWNhc2UgRVRJTUVET1VUOgkJcmV0dXJuIFdTQUVUSU1FRE9VVDsKLQljYXNlIEVDT05OUkVGVVNFRDoJcmV0dXJuIFdTQUVDT05OUkVGVVNFRDsKLQljYXNlIEVMT09QOgkJcmV0dXJuIFdTQUVMT09QOwotCWNhc2UgRU5BTUVUT09MT05HOglyZXR1cm4gV1NBRU5BTUVUT09MT05HOwotCWNhc2UgRUhPU1RET1dOOgkJcmV0dXJuIFdTQUVIT1NURE9XTjsKLQljYXNlIEVIT1NUVU5SRUFDSDoJcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsKLQljYXNlIEVOT1RFTVBUWToJCXJldHVybiBXU0FFTk9URU1QVFk7Ci0jaWZkZWYgRVBST0NMSU0KLQljYXNlIEVQUk9DTElNOgkJcmV0dXJuIFdTQUVQUk9DTElNOwotI2VuZGlmCi0jaWZkZWYgRVVTRVJTCi0JY2FzZSBFVVNFUlM6CQlyZXR1cm4gV1NBRVVTRVJTOwotI2VuZGlmCi0jaWZkZWYgRURRVU9UCi0JY2FzZSBFRFFVT1Q6CQlyZXR1cm4gV1NBRURRVU9UOwotI2VuZGlmCi0JY2FzZSBFU1RBTEU6CQlyZXR1cm4gV1NBRVNUQUxFOwotCWNhc2UgRVJFTU9URToJCXJldHVybiBXU0FFUkVNT1RFOwotLyoganVzdCBpbiBjYXNlIHdlIGV2ZXIgZ2V0IGhlcmUgYW5kIHRoZXJlIGFyZSBubyBwcm9ibGVtcyAqLwotCWNhc2UgMDoJCQlyZXR1cm4gMDsKLQotICAgICAgICBkZWZhdWx0OgotCQlmcHJpbnRmKHN0ZGVyciwgIndpbnNvY2s6IHVua25vd24gZXJyb3JubyAlZCFcbiIsIGVycm5vKTsKLQkJcmV0dXJuIFdTQUVPUE5PVFNVUFA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlcnJub190b193c2FlcnJubyh2b2lkKQotewotCXdzYV9lcnJubyA9IHdzYWVycm5vKCk7Ci19Ci0KLQotc3RhdGljIFdPUkQgd3NhaGVycm5vKHZvaWQpCi17Ci0jaWYgREVCVUdfV0lOU09DSwotI2lmbmRlZiBzdW4KLSNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid2luc29jazogaF9lcnJubyAlZCwgKCVzKS5cbiIsIAotICAgICAgICAgICAgICAgIAkJCWhfZXJybm8sIHN5c19lcnJsaXN0W2hfZXJybm9dKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5zb2NrOiBoX2Vycm5vICVkLlxuIiwgaF9lcnJubyk7Ci0JCWhlcnJvcigid2luZTogd2luc29jazogd3NhaGVycm5vIik7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3aW5zb2NrOiBoX2Vycm5vICVkXG4iLCBoX2Vycm5vKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgICAgICAgc3dpdGNoKGhfZXJybm8pCi0gICAgICAgIHsKLQljYXNlIEhPU1RfTk9UX0ZPVU5EOglyZXR1cm4gV1NBSE9TVF9OT1RfRk9VTkQ7Ci0JY2FzZSBUUllfQUdBSU46CQlyZXR1cm4gV1NBVFJZX0FHQUlOOwotCWNhc2UgTk9fUkVDT1ZFUlk6CXJldHVybiBXU0FOT19SRUNPVkVSWTsKLQljYXNlIE5PX0RBVEE6CQlyZXR1cm4gV1NBTk9fREFUQTsgCi0vKiBqdXN0IGluIGNhc2Ugd2UgZXZlciBnZXQgaGVyZSBhbmQgdGhlcmUgYXJlIG5vIHByb2JsZW1zICovCi0JY2FzZSAwOgkJCXJldHVybiAwOwotCi0KLSAgICAgICAgZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJ3aW5zb2NrOiB1bmtub3duIGhfZXJyb3JubyAlZCFcbiIsIGhfZXJybm8pOwotCQlyZXR1cm4gV1NBRU9QTk9UU1VQUDsKLQl9Ci19Ci0KLQotc3RhdGljIHZvaWQgaGVycm5vX3RvX3dzYWVycm5vKHZvaWQpCi17Ci0Jd3NhX2Vycm5vID0gd3NhaGVycm5vKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgY29udmVydF9zb2Nrb3B0KElOVCAqbGV2ZWwsIElOVCAqb3B0bmFtZSkKLXsKLS8qICQlIyUhIyEgd2h5IGNvdWxkbid0IHRoZXkgdXNlIHRoZSBzYW1lIHZhbHVlcyBmb3IgYm90aCB3aW5zb2NrIGFuZCB1bml4ID8gKi8KLQotCXN3aXRjaCAoKmxldmVsKSB7Ci0JCWNhc2UgLTE6IAotCQkJKmxldmVsID0gU09MX1NPQ0tFVDsKLQkJCXN3aXRjaCAoKm9wdG5hbWUpIHsKLQkJCWNhc2UgMHgwMToJKm9wdG5hbWUgPSBTT19ERUJVRzsKLQkJCQkJYnJlYWs7Ci0JCQljYXNlIDB4MDQ6CSpvcHRuYW1lID0gU09fUkVVU0VBRERSOwotCQkJCQlicmVhazsKLQkJCWNhc2UgMHgwODoJKm9wdG5hbWUgPSBTT19LRUVQQUxJVkU7Ci0JCQkJCWJyZWFrOwotCQkJY2FzZSAweDEwOgkqb3B0bmFtZSA9IFNPX0RPTlRST1VURTsKLQkJCQkJYnJlYWs7Ci0JCQljYXNlIDB4MjA6CSpvcHRuYW1lID0gU09fQlJPQURDQVNUOwotCQkJCQlicmVhazsKLQkJCWNhc2UgMHg4MDoJKm9wdG5hbWUgPSBTT19MSU5HRVI7Ci0JCQkJCWJyZWFrOwotCQkJY2FzZSAweDEwMDoJKm9wdG5hbWUgPSBTT19PT0JJTkxJTkU7Ci0JCQkJCWJyZWFrOwotCQkJY2FzZSAweDEwMDE6CSpvcHRuYW1lID0gU09fU05EQlVGOwotCQkJCQlicmVhazsKLQkJCWNhc2UgMHgxMDAyOgkqb3B0bmFtZSA9IFNPX1JDVkJVRjsKLQkJCQkJYnJlYWs7Ci0JCQljYXNlIDB4MTAwNzoJKm9wdG5hbWUgPSBTT19FUlJPUjsKLQkJCQkJYnJlYWs7Ci0JCQljYXNlIDB4MTAwODoJKm9wdG5hbWUgPSBTT19UWVBFOwotCQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6IAotCQkJCQlmcHJpbnRmKHN0ZGVyciwgImNvbnZlcnRfc29ja29wdCgpIHVua25vd24gb3B0bmFtZSAlZFxuIiwgKm9wdG5hbWUpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDY6CSpvcHRuYW1lID0gSVBQUk9UT19UQ1A7Ci0JfQotfQotCi0jaWZuZGVmIFdJTkVMSUIKLXN0YXRpYyBTRUdQVFIgY29weV9zdHJpbmdsaXN0KGNoYXIgKipsaXN0KQotewotCVNFR1BUUiAqc19saXN0OwotCWludCBpOwotCWZvcihpPTA7bGlzdFtpXTtpKyspCi0JCTsKLQlzX2xpc3QgPSBzY3JhdGNoX2FsbG9jKHNpemVvZihTRUdQVFIpKihpKzEpKTsKLQlmb3IoaT0wO2xpc3RbaV07aSsrKQotCXsKLQkJdm9pZCAqY29weSA9IHNjcmF0Y2hfYWxsb2Moc3RybGVuKGxpc3RbaV0pKzEpOwotCQlzdHJjcHkoY29weSxsaXN0W2ldKTsKLQkJc19saXN0W2ldPUdFVF9TRUdfUFRSKGNvcHkpOwotCX0KLQlzX2xpc3RbaV09MDsKLQlyZXR1cm4gR0VUX1NFR19QVFIoc19saXN0KTsKLX0KLQkKLQotc3RhdGljIHZvaWQgQ09OVkVSVF9IT1NURU5UKHN0cnVjdCBXSU5faG9zdGVudCAqaGVhcGVudCwgc3RydWN0IGhvc3RlbnQgKmhvc3QpCi17Ci0JU0VHUFRSICphZGRyX2xpc3Q7Ci0JaW50IGk7Ci0JUmVzZXRTY3JhdGNoKCk7Ci0Jc3RyY3B5KGhlYXBlbnQtPmhvc3RuYW1lLGhvc3QtPmhfbmFtZSk7Ci0JaGVhcGVudC0+aF9uYW1lID0gR0VUX1NFR19QVFIoaGVhcGVudC0+aG9zdG5hbWUpOwotCS8qIENvbnZlcnQgYWxpYXNlcy4gSGF2ZSB0byBjcmVhdGUgYXJyYXkgd2l0aCBGQVIgcG9pbnRlcnMgKi8KLQlpZighaG9zdC0+aF9hbGlhc2VzKQotCQloZWFwZW50LT5oX2FsaWFzZXMgPSAwOwotCWVsc2UKLQkJaGVhcGVudC0+aF9hbGlhc2VzID0gY29weV9zdHJpbmdsaXN0KGhvc3QtPmhfYWxpYXNlcyk7Ci0KLQloZWFwZW50LT5oX2FkZHJ0eXBlID0gaG9zdC0+aF9hZGRydHlwZTsKLQloZWFwZW50LT5oX2xlbmd0aCA9IGhvc3QtPmhfbGVuZ3RoOwotCWZvcihpPTA7aG9zdC0+aF9hZGRyX2xpc3RbaV07aSsrKQotCQk7Ci0JYWRkcl9saXN0PXNjcmF0Y2hfYWxsb2Moc2l6ZW9mKFNFR1BUUikqKGkrMSkpOwotCWhlYXBlbnQtPmhfYWRkcl9saXN0ID0gKGNoYXIqKilHRVRfU0VHX1BUUihhZGRyX2xpc3QpOwotCWZvcihpPTA7aG9zdC0+aF9hZGRyX2xpc3RbaV07aSsrKQotCXsKLQkJdm9pZCAqYWRkcj1zY3JhdGNoX2FsbG9jKGhvc3QtPmhfbGVuZ3RoKTsKLQkJbWVtY3B5KGFkZHIsaG9zdC0+aF9hZGRyX2xpc3RbaV0saG9zdC0+aF9sZW5ndGgpOwotCQlhZGRyX2xpc3RbaV09R0VUX1NFR19QVFIoYWRkcik7Ci0JfQotCWFkZHJfbGlzdFtpXT0wOwotfQotCi1zdGF0aWMgdm9pZCBDT05WRVJUX1BST1RPRU5UKHN0cnVjdCBXSU5fcHJvdG9lbnQgKmhlYXBlbnQsIAotCXN0cnVjdCBwcm90b2VudCAqcHJvdG8pCi17Ci0JUmVzZXRTY3JhdGNoKCk7Ci0JaGVhcGVudC0+cF9uYW1lPSBzY3JhdGNoX3N0cmR1cChwcm90by0+cF9uYW1lKTsKLQloZWFwZW50LT5wX2FsaWFzZXM9cHJvdG8tPnBfYWxpYXNlcyA/IAotCQkJY29weV9zdHJpbmdsaXN0KHByb3RvLT5wX2FsaWFzZXMpIDogMDsKLQloZWFwZW50LT5wX3Byb3RvID0gcHJvdG8tPnBfcHJvdG87Ci19Ci0KLXN0YXRpYyB2b2lkIENPTlZFUlRfU0VSVkVOVChzdHJ1Y3QgV0lOX3NlcnZlbnQgKmhlYXBlbnQsIHN0cnVjdCBzZXJ2ZW50ICpzZXJ2KQotewotCVJlc2V0U2NyYXRjaCgpOwotCWhlYXBlbnQtPnNfbmFtZSA9IHNjcmF0Y2hfc3RyZHVwKHNlcnYtPnNfbmFtZSk7Ci0JaGVhcGVudC0+c19hbGlhc2VzID0gc2Vydi0+c19hbGlhc2VzID8KLQkJCWNvcHlfc3RyaW5nbGlzdChzZXJ2LT5zX2FsaWFzZXMpIDogMDsKLQloZWFwZW50LT5zX3BvcnQgPSBzZXJ2LT5zX3BvcnQ7Ci0JaGVhcGVudC0+c19wcm90byA9IHNjcmF0Y2hfc3RyZHVwKHNlcnYtPnNfcHJvdG8pOwotfQotI2Vsc2UKLSNkZWZpbmUgQ09OVkVSVF9IT1NURU5UKGEsYikJbWVtY3B5KGEsICZiLCBzaXplb2YoYSkpCi0jZGVmaW5lIENPTlZFUlRfUFJPVE9FTlQoYSxiKQltZW1jcHkoYSwgJmIsIHNpemVvZihhKSkKLSNkZWZpbmUgQ09OVkVSVF9TRVJWRU5UKGEsYikJbWVtY3B5KGEsICZiLCBzaXplb2YoYSkpCi0jZW5kaWYKLQotU09DS0VUIFdJTlNPQ0tfYWNjZXB0KFNPQ0tFVCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIElOVCAqYWRkcmxlbikKLXsKLQlpbnQgc29jazsKLQotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfYWNjZXB0OiBzb2NrZXQgJWQsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgcywgKGludCkgYWRkciwgKmFkZHJsZW4pOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIElOVkFMSURfU09DS0VUOwotCX0KLQotCWlmICgoc29jayA9IGFjY2VwdChzLCBhZGRyLCAoaW50ICopIGFkZHJsZW4pKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0JfQotCXJldHVybiBzb2NrOwotfQotCi1JTlQgV0lOU09DS19iaW5kKFNPQ0tFVCBzLCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbWUsIElOVCBuYW1lbGVuKQotewotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9iaW5kOiBzb2NrZXQgJWQsIHB0ciAlOHgsIGxlbmd0aCAlZFxuIiwgcywgKGludCkgbmFtZSwgbmFtZWxlbik7Ci0JZHVtcF9zb2NrYWRkcihuYW1lKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKG5hbWVsZW4gPCBzaXplb2YoKm5hbWUpKSB7Ci0JCVdTQVNldExhc3RFcnJvcihXU0FFRkFVTFQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCS8qIGNoZWNrIHRoZSBzb2NrZXQgZmFtaWx5ICovCi0JaWYgKCAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW5hbWUpLT5zaW5fZmFtaWx5ICE9IEFGX0lORVQgKSB7Ci0JCVdTQVNldExhc3RFcnJvcihXU0FFQUZOT1NVUFBPUlQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCWlmIChiaW5kKHMsIG5hbWUsIG5hbWVsZW4pIDwgMCkgewotCQlzd2l0Y2goZXJybm8pIHsKLQkJY2FzZSBFQkFERjoKLQkJCVdTQVNldExhc3RFcnJvcihXU0FFTk9UU09DSyk7Ci0JCQlicmVhazsKLQkJY2FzZSBFQUREUk5PVEFWQUlMOgotCQkJV1NBU2V0TGFzdEVycm9yKFdTQUVJTlZBTCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICAJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVCBXSU5TT0NLX2Nsb3Nlc29ja2V0KFNPQ0tFVCBzKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfY2xvc2Vzb2NrZXQ6IHNvY2tldCAlZFxuIiwgcyk7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCUZEX0NMUihzLCAmZmRfaW5fdXNlKTsKLQotCWlmIChjbG9zZShzKSA8IDApIHsKLQkJaWYgKGVycm5vID09IEVCQURGKQotCQkJV1NBU2V0TGFzdEVycm9yKFdTQUVOT1RTT0NLKTsKLQkJZWxzZQotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UIFdJTlNPQ0tfY29ubmVjdChTT0NLRVQgcywgc3RydWN0IHNvY2thZGRyICpuYW1lLCBJTlQgbmFtZWxlbikKLXsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX2Nvbm5lY3Q6IHNvY2tldCAlZCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKLQlkdW1wX3NvY2thZGRyKG5hbWUpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0KLQlpZiAoY29ubmVjdChzLCBuYW1lLCBuYW1lbGVuKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UIFdJTlNPQ0tfZ2V0cGVlcm5hbWUoU09DS0VUIHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UICpuYW1lbGVuKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfZ2V0cGVlcm5hbWU6IHNvY2tldDogJWQsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIHMsIChpbnQpIG5hbWUsICpuYW1lbGVuKTsKLQlkdW1wX3NvY2thZGRyKG5hbWUpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0KLQlpZiAoZ2V0cGVlcm5hbWUocywgbmFtZSwgKGludCAqKSBuYW1lbGVuKSA8IDApIHsKLQkJaWYgKGhfZXJybm8gPCAwKSB7Ci0gICAgICAgIAkJZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfSBlbHNlIHsKLQkJCWhlcnJub190b193c2FlcnJubygpOwotCQl9Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UIFdJTlNPQ0tfZ2V0c29ja25hbWUoU09DS0VUIHMsIHN0cnVjdCBzb2NrYWRkciAqbmFtZSwgSU5UICpuYW1lbGVuKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfZ2V0c29ja25hbWU6IHNvY2tldDogJWQsIHB0ciAlOHgsIHB0ciAlOHhcbiIsIHMsIChpbnQpIG5hbWUsIChpbnQpICpuYW1lbGVuKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKGdldHNvY2tuYW1lKHMsIG5hbWUsIChpbnQgKikgbmFtZWxlbikgPCAwKSB7Ci0JCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCX0gZWxzZSB7Ci0JCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfQotICAgICAgICAJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLUlOVAotV0lOU09DS19nZXRzb2Nrb3B0KFNPQ0tFVCBzLCBJTlQgbGV2ZWwsIElOVCBvcHRuYW1lLCBjaGFyICpvcHR2YWwsIElOVCAqb3B0bGVuKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfZ2V0c29ja29wdDogc29ja2V0OiAlZCwgb3B0ICVkLCBwdHIgJTh4LCBwdHIgJTh4XG4iLCBzLCBsZXZlbCwgKGludCkgb3B0dmFsLCAoaW50KSAqb3B0bGVuKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JY29udmVydF9zb2Nrb3B0KCZsZXZlbCwgJm9wdG5hbWUpOwotCi0JaWYgKGdldHNvY2tvcHQocywgKGludCkgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgKGludCAqKSBvcHRsZW4pIDwgMCkgewotCQlpZiAoZXJybm8gPT0gRUJBREYpCi0JCQlXU0FTZXRMYXN0RXJyb3IoV1NBRU5PVFNPQ0spOwotCQllbHNlCi0gICAgICAgIAkJZXJybm9fdG9fd3NhZXJybm8oKTsKLSAgICAgICAgCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCXJldHVybiAwOwotfQotCi11X2xvbmcgV0lOU09DS19odG9ubCh1X2xvbmcgaG9zdGxvbmcpCi17Ci0JcmV0dXJuKCBodG9ubChob3N0bG9uZykgKTsKLX0gICAgICAgICAKLQotdV9zaG9ydCBXSU5TT0NLX2h0b25zKHVfc2hvcnQgaG9zdHNob3J0KQotewotCXJldHVybiggaHRvbnMoaG9zdHNob3J0KSApOwotfQotCi11X2xvbmcgV0lOU09DS19pbmV0X2FkZHIoY2hhciAqY3ApCi17Ci0JcmV0dXJuKCBpbmV0X2FkZHIoY3ApICk7Ci19Ci0KLWNoYXIgKldJTlNPQ0tfaW5ldF9udG9hKHN0cnVjdCBpbl9hZGRyIGluKQotewotCWNoYXIgKnM7Ci0KLS8qCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfaW5ldF9udG9hOiAlOGx4XG4iLCAoaW50KSBpbik7Ki8KLQotCWlmICgocyA9IGluZXRfbnRvYShpbikpID09IE5VTEwpIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzdHJuY3B5KEhlYXAtPm50b2FfYnVmZmVyLCBzLCBzaXplb2YoSGVhcC0+bnRvYV9idWZmZXIpICk7Ci0KLQlyZXR1cm4gKGNoYXIgKikgR0VUX1NFR19QVFIoJkhlYXAtPm50b2FfYnVmZmVyKTsKLX0KLQotSU5UIFdJTlNPQ0tfaW9jdGxzb2NrZXQoU09DS0VUIHMsIHVfbG9uZyBjbWQsIHVfbG9uZyAqYXJncCkKLXsKLQlsb25nIG5ld2NtZDsKLQl1X2xvbmcgKm5ld2FyZ3A7Ci0JY2hhciAqY3RsbmFtZTsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX2lvY3RsOiBzb2NrZXQgJWQsIGNtZCAlbFgsIHB0ciAlOHhcbiIsIHMsIGNtZCwgKGludCkgYXJncCk7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCS8qIFdoeSBjYW4ndCB0aGV5IGFsbCB1c2UgdGhlIHNhbWUgaW9jdGwgbnVtYmVycyAqLwotCW5ld2NtZD1jbWQ7Ci0JbmV3YXJncD1hcmdwOwotCWN0bG5hbWU9MDsKLQlpZihjbWQgPT0gX0lPUignZicsMTI3LHVfbG9uZykpCi0JewotCQljdGxuYW1lPSJGSU9OUkVBRCI7Ci0JCW5ld2NtZD1GSU9OUkVBRDsKLQl9ZWxzZSAKLQlpZihjbWQgPT0gX0lPVygnZicsMTI2LHVfbG9uZykgfHwgY21kID09IF9JT1IoJ2YnLDEyNix1X2xvbmcpKQotCXsKLQkJY3RsbmFtZT0iRklPTkJJTyI7Ci0JCW5ld2NtZD1GSU9OQklPOwotCX1lbHNlCi0JaWYoY21kID09IF9JT1coJ2YnLDEyNSx1X2xvbmcpKQotCXsKLQkJY3RsbmFtZT0iRklPQVNZTkMiOwotCQluZXdjbWQ9RklPQVNZTkM7Ci0JfQotCi0JaWYoIWN0bG5hbWUpCi0JCWZwcmludGYoc3RkZXJyLCJVbmtub3duIHdpbnNvY2sgaW9jdGwuIFRyeWluZyBhbnl3YXlcbiIpOwotCWVsc2UKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiUmVjb2duaXplZCBhcyAlc1xuIiwgY3RsbmFtZSk7Ci0JCi0KLQlpZiAoaW9jdGwocywgbmV3Y21kLCBuZXdhcmdwKSA8IDApIHsKLQkJaWYgKGVycm5vID09IEVCQURGKQotCQkJV1NBU2V0TGFzdEVycm9yKFdTQUVOT1RTT0NLKTsKLQkJZWxzZQotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotSU5UIFdJTlNPQ0tfbGlzdGVuKFNPQ0tFVCBzLCBJTlQgYmFja2xvZykKLXsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX2xpc3Rlbjogc29ja2V0ICVkLCBiYWNrbG9nICVkXG4iLCBzLCBiYWNrbG9nKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKGxpc3RlbihzLCBiYWNrbG9nKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdV9sb25nIFdJTlNPQ0tfbnRvaGwodV9sb25nIG5ldGxvbmcpCi17Ci0JcmV0dXJuKCBudG9obChuZXRsb25nKSApOwotfQotCi11X3Nob3J0IFdJTlNPQ0tfbnRvaHModV9zaG9ydCBuZXRzaG9ydCkKLXsKLQlyZXR1cm4oIG50b2hzKG5ldHNob3J0KSApOwotfQotCi1JTlQgV0lOU09DS19yZWN2KFNPQ0tFVCBzLCBjaGFyICpidWYsIElOVCBsZW4sIElOVCBmbGFncykKLXsKLQlpbnQgbGVuZ3RoOwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9yZWN2OiBzb2NrZXQgJWQsIHB0ciAlOHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsIHMsIChpbnQpIGJ1ZiwgbGVuLCBmbGFncyk7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCWlmICgobGVuZ3RoID0gcmVjdihzLCBidWYsIGxlbiwgZmxhZ3MpKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gbGVuZ3RoOwotfQotCi1JTlQgV0lOU09DS19yZWN2ZnJvbShTT0NLRVQgcywgY2hhciAqYnVmLCBJTlQgbGVuLCBJTlQgZmxhZ3MsIAotCQlzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sIGludCAqZnJvbWxlbikKLXsKLQlpbnQgbGVuZ3RoOwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9yZWN2ZnJvbTogc29ja2V0ICVkLCBwdHIgJThseCwgbGVuZ3RoICVkLCBmbGFncyAlZFxuIiwgcywgKHVuc2lnbmVkIGxvbmcpYnVmLCBsZW4sIGZsYWdzKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKChsZW5ndGggPSByZWN2ZnJvbShzLCBidWYsIGxlbiwgZmxhZ3MsIGZyb20sIGZyb21sZW4pKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gbGVuZ3RoOwotfQotCi1JTlQgV0lOU09DS19zZWxlY3QoSU5UIG5mZHMsIFdpblNvY2tfZmRfc2V0ICp3c19yZWFkZmRzLAotCVdpblNvY2tfZmRfc2V0ICp3c193cml0ZWZkcywgV2luU29ja19mZF9zZXQgKndzX2V4Y2VwdGZkcywKLQlzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKLXsKLQlpbnQgcmV0OwotCWludCBpOwotCWludCBjb3VudDsKLQlpbnQgaGlnaGZkOwotCWZkX3NldCByZWFkZmRzLHdyaXRlZmRzLGV4Y2VwdGZkczsKLQlGRF9aRVJPKCZyZWFkZmRzKTsKLQlGRF9aRVJPKCZ3cml0ZWZkcyk7Ci0JRkRfWkVSTygmZXhjZXB0ZmRzKTsKLQkKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX3NlbGVjdCBjYWxsZWQ6IG5mZHMgJWQgKGlnbm9yZWQpLCBwdHIgJThseCwgcHRyICU4bHgsIHB0ciAlOGx4XG4iLCBuZmRzLCAodW5zaWduZWQgbG9uZykgd3NfcmVhZGZkcywgKHVuc2lnbmVkIGxvbmcpIHdzX3dyaXRlZmRzLCAodW5zaWduZWQgbG9uZykgd3NfZXhjZXB0ZmRzKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0Ffc2VsZWN0OiByZXR1cm5pbmcgZXJyb3IgV1NBTk9USU5JVElBTElTRURcbiIpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQkKLS8qIEluIHNvbWUgc29ydCBvZiBhdHRlbXB0IHRvIGJlIEJTRC1jb21wYXRpYmxlLCBNUy1XaW5zb2NrIGFjY2VwdHMgYW5kCi0gICBkaXNjYXJkcyB0aGUgbmZkcyBwYXJhbWV0ZXIuICBIb3dldmVyLCB0aGUgZm9ybWF0IG9mIHdpbmRvemUncyBmZF9zZXRzCi0gICBpcyB0b3RhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSBCU0Qgc3RhbmRhcmQuICBTbyBtdWNoIGZvciBjb21wYXRpYmlsaXR5LgotICAgSGVuY2UsIHdlIG11c3QgY29udmVydCB0aGUgd2luc29jayBhcnJheS1vZi1pbnRzIGZkX3NldCB0byB0aGUgVU5JWAotICAgYml0bWFwcGVkIGZvcm1hdC4gKi8KLQotCWlmKHdzX3JlYWRmZHMhPU5VTEwpIHsKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgInJlYWRmZHM6ICglZCkgIix3c19yZWFkZmRzLT5mZF9jb3VudCk7Ci0JCWZvcihpPTA7aTwod3NfcmVhZGZkcy0+ZmRfY291bnQpO2krKykgewotCQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiAlZCIsKCAoU09DS0VUICopJigoKGNoYXIgKil3c19yZWFkZmRzKVsyXSkgKVtpXSk7Ci0JCQkvKkZEX1NFVCgoKFNPQ0tFVCAqKSYoKChjaGFyICopd3NfcmVhZGZkcylbMl0pKVtpXSwgJnJlYWRmZHMpOyovCi0JCQlGRF9TRVQod3NfcmVhZGZkcy0+ZmRfYXJyYXlbaV0sICZyZWFkZmRzKTsKLQkJfQotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXG4iKTsKLQl9IGVsc2UgewotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAicmVhZGZkczogKG51bGwpXG4iKTsKLQl9Ci0JaWYod3Nfd3JpdGVmZHMhPU5VTEwpIHsKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIndyaXRlZmRzOiAoJWQpICIsd3Nfd3JpdGVmZHMtPmZkX2NvdW50KTsKLQkJZm9yKGk9MDtpPCh3c193cml0ZWZkcy0+ZmRfY291bnQpO2krKykgewotCQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiAlZCIsKCAoU09DS0VUICopJigoKGNoYXIgKil3c193cml0ZWZkcylbMl0pIClbaV0pOwotCQkJLypGRF9TRVQoKChTT0NLRVQgKikmKCgoY2hhciAqKXdzX3dyaXRlZmRzKVsyXSkpW2ldLCAmd3JpdGVmZHMpOyovCi0JCQlGRF9TRVQod3Nfd3JpdGVmZHMtPmZkX2FycmF5W2ldLCAmd3JpdGVmZHMpOwotCQl9Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcbiIpOwotCX0gZWxzZSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJ3cml0ZWZkczogKG51bGwpXG4iKTsKLQl9Ci0JaWYod3NfZXhjZXB0ZmRzIT1OVUxMKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJleGNlcHRmZHM6ICglZCkgIix3c19leGNlcHRmZHMtPmZkX2NvdW50KTsKLQkJZm9yKGk9MDtpPCh3c19leGNlcHRmZHMtPmZkX2NvdW50KTtpKyspIHsKLQkJCWRwcmludGZfd2luc29jayhzdGRkZWIsICIgJWQiLCggKFNPQ0tFVCAqKSYoKChjaGFyICopd3NfZXhjZXB0ZmRzKVsyXSkgKVtpXSk7Ci0JCQkvKkZEX1NFVCgoKFNPQ0tFVCAqKSYoKChjaGFyICopd3NfZXhjZXB0ZmRzKVsyXSkpW2ldLCAmZXhjZXB0ZmRzKTsqLwotCQkJRkRfU0VUKHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV0sICZleGNlcHRmZHMpOwotCQl9Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcbiIpOwotCX0gZWxzZSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJleGNlcHRmZHM6IChudWxsKVxuIik7Ci0JfQotCQotCS8qIE1ha2UgdGhlIHNlbGVjdCgpIGNhbGwgKi8KLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX3NlbGVjdDogY2FsbGluZyBzZWxlY3QoKVxuIik7Ci0JaGlnaGZkPTI1NjsgLyogV2Ugc2hvdWxkIGNvdW50IHRoZW0sIGJ1dCB0aGlzIHdvcmtzICovCi0JcmV0PXNlbGVjdChoaWdoZmQsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsIHRpbWVvdXQpOwotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0Ffc2VsZWN0OiBzZWxlY3QoKSByZXR1cm5lZCAlZFxuIixyZXQpOwotCWlmKHJldDwwKSB7Ci0JCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0Ffc2VsZWN0IHJldHVybmluZzogRXJyb3IgJWRcbiIsU09DS0VUX0VSUk9SKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0JCi0JLyogdXBkYXRlIHRoZSB3aW5zb2NrIGZkIHNldHMgKi8KLQlpZih3c19yZWFkZmRzIT1OVUxMKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJyZWFkZmRzOiAiKTsKLQkJY291bnQ9MDsKLQkJZm9yKGk9MDtpPGhpZ2hmZDtpKyspIHsKLQkJCWlmKEZEX0lTU0VUKGksJnJlYWRmZHMpKSB7Ci0JCQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIiAlZCIsaSk7Ci0JCQkJd3NfcmVhZGZkcy0+ZmRfYXJyYXlbY291bnQrK109aTsKLQkJCX0KLQkJfQotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiICAoJWQpXG4iLGNvdW50KTsKLQkJd3NfcmVhZGZkcy0+ZmRfY291bnQ9Y291bnQ7Ci0JfSBlbHNlIHsKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgInJlYWRmZHM6IChudWxsKVxuIik7Ci0JfQotCWlmKHdzX3dyaXRlZmRzIT1OVUxMKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJ3cml0ZWZkczogIik7Ci0JCWNvdW50PTA7Ci0JCWZvcihpPTA7aTxoaWdoZmQ7aSsrKSB7Ci0JCQlpZihGRF9JU1NFVChpLCZ3cml0ZWZkcykpIHsKLQkJCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiICVkIixpKTsKLQkJCQl3c193cml0ZWZkcy0+ZmRfYXJyYXlbY291bnQrK109aTsKLQkJCX0KLQkJfQotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiICAoJWQpXG4iLGNvdW50KTsKLQkJd3Nfd3JpdGVmZHMtPmZkX2NvdW50PWNvdW50OwotCX0gZWxzZSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJ3cml0ZWZkczogKG51bGwpXG4iKTsKLQl9Ci0JaWYod3NfZXhjZXB0ZmRzIT1OVUxMKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJleGNlcHRmZHM6ICIpOwotCQljb3VudD0wOwotCQlmb3IoaT0wO2k8aGlnaGZkO2krKykgewotCQkJaWYoRkRfSVNTRVQoaSwmZXhjZXB0ZmRzKSkgewotCQkJCWRwcmludGZfd2luc29jayhzdGRkZWIsICIgJWQiLGkpOwotCQkJCXdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbY291bnQrK109aTsKLQkJCX0KLQkJfQotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiICAoJWQpXG4iLGNvdW50KTsKLQkJd3NfZXhjZXB0ZmRzLT5mZF9jb3VudD1jb3VudDsKLQl9IGVsc2UgewotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiZXhjZXB0ZmRzOiAobnVsbClcbiIpOwotCX0KLQkKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX3NlbGVjdCByZXR1cm5pbmc6ICVkXG4iLHJldCk7Ci0JcmV0dXJuKHJldCk7CQotfQotCi1JTlQgV0lOU09DS19zZW5kKFNPQ0tFVCBzLCBjaGFyICpidWYsIElOVCBsZW4sIElOVCBmbGFncykKLXsKLQlpbnQgbGVuZ3RoOwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9zZW5kOiBzb2NrZXQgJWQsIHB0ciAlOGx4LCBsZW5ndGggJWQsIGZsYWdzICVkXG4iLCBzLCAodW5zaWduZWQgbG9uZykgYnVmLCBsZW4sIGZsYWdzKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKChsZW5ndGggPSBzZW5kKHMsIGJ1ZiwgbGVuLCBmbGFncykpIDwgMCkgewotICAgICAgICAJZXJybm9fdG9fd3NhZXJybm8oKTsKLSAgICAgICAgCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLUlOVCBXSU5TT0NLX3NlbmR0byhTT0NLRVQgcywgY2hhciAqYnVmLCBJTlQgbGVuLCBJTlQgZmxhZ3MsCi0JCXN0cnVjdCBzb2NrYWRkciAqdG8sIElOVCB0b2xlbikKLXsKLQlpbnQgbGVuZ3RoOwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9zZW5kdG86IHNvY2tldCAlZCwgcHRyICU4bHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsIHMsICh1bnNpZ25lZCBsb25nKSBidWYsIGxlbiwgZmxhZ3MpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0KLQlpZiAoKGxlbmd0aCA9IHNlbmR0byhzLCBidWYsIGxlbiwgZmxhZ3MsIHRvLCB0b2xlbikpIDwgMCkgewotICAgICAgICAJZXJybm9fdG9fd3NhZXJybm8oKTsKLSAgICAgICAgCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCXJldHVybiBsZW5ndGg7Ci19Ci0KLUlOVCBXSU5TT0NLX3NldHNvY2tvcHQoU09DS0VUIHMsIElOVCBsZXZlbCwgSU5UIG9wdG5hbWUsIGNvbnN0IGNoYXIgKm9wdHZhbCwgCi0JCQlJTlQgb3B0bGVuKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0Ffc2V0c29ja29wdDogc29ja2V0ICVkLCBsZXZlbCAlZCwgb3B0ICVkLCBwdHIgJTh4LCBsZW4gJWRcbiIsIHMsIGxldmVsLCBvcHRuYW1lLCAoaW50KSBvcHR2YWwsIG9wdGxlbik7Ci0JY29udmVydF9zb2Nrb3B0KCZsZXZlbCwgJm9wdG5hbWUpOwotCQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKHNldHNvY2tvcHQocywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1JTlQgV0lOU09DS19zaHV0ZG93bihTT0NLRVQgcywgSU5UIGhvdykKLXsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX3NodXRkb3duOiBzb2NrZXQgcyAlZCwgaG93ICVkXG4iLCBzLCBob3cpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0KLQlpZiAoc2h1dGRvd24ocywgaG93KSA8IDApIHsKLSAgICAgICAgCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotU09DS0VUIFdJTlNPQ0tfc29ja2V0KElOVCBhZiwgSU5UIHR5cGUsIElOVCBwcm90b2NvbCkKLXsKLSAgICBpbnQgc29jazsKLQotICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0Ffc29ja2V0OiBhZj0lZCB0eXBlPSVkIHByb3RvY29sPSVkXG4iLCBhZiwgdHlwZSwgcHJvdG9jb2wpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIElOVkFMSURfU09DS0VUOwotCX0KLQotICAgIC8qIGNoZWNrIHRoZSBzb2NrZXQgZmFtaWx5ICovCi0gICAgc3dpdGNoKGFmKSB7Ci0gICAgY2FzZSBBRl9JTkVUOgotICAgIGNhc2UgQUZfVU5TUEVDOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBXU0FTZXRMYXN0RXJyb3IoV1NBRUFGTk9TVVBQT1JUKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfU09DS0VUOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGUgc29ja2V0IHR5cGUgKi8KLSAgICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgU09DS19TVFJFQU06Ci0gICAgY2FzZSBTT0NLX0RHUkFNOgotICAgIGNhc2UgU09DS19SQVc6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFdTQVNldExhc3RFcnJvcihXU0FFU09DS1ROT1NVUFBPUlQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoZSBwcm90b2NvbCB0eXBlICovCi0gICAgaWYgKCBwcm90b2NvbCA8IDAgKSB7IC8qIGRvbid0IHN1cHBvcnQgbmVnYXRpdmUgdmFsdWVzICovCi0gICAgICAgIFdTQVNldExhc3RFcnJvcihXU0FFUFJPVE9OT1NVUFBPUlQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgfQotCi0gICAgaWYgKCBhZiA9PSBBRl9VTlNQRUMpIHsgLyogZGlkIHRoZXkgbm90IHNwZWNpZnkgdGhlIGFkZHJlc3MgZmFtaWx5PyAqLwotICAgICAgICBzd2l0Y2gocHJvdG9jb2wpIHsKLSAgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKLSAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICBhZiA9IEFGX0lORVQ7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBJUFBST1RPX1VEUDoKLSAgICAgICAgICAgICBpZiAodHlwZSA9PSBTT0NLX0RHUkFNKSB7Ci0gICAgICAgICAgICAgICAgIGFmID0gQUZfSU5FVDsKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgIFdTQVNldExhc3RFcnJvcihXU0FFUFJPVE9UWVBFKTsKLSAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKHNvY2sgPSBzb2NrZXQoYWYsIHR5cGUsIHByb3RvY29sKSkgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFUEVSTSkgewotICAgICAgICAgICAgLyogbm9uIHN1cGVyLXVzZXIgd2FudHMgYSByYXcgc29ja2V0ICovCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldTQV9zb2NrZXQ6IG5vdCBlbm91Z2ggcHJpdmlsZWdlc1xuIik7Ci0gICAgICAgICAgICBXU0FTZXRMYXN0RXJyb3IoV1NBRVNPQ0tUTk9TVVBQT1JUKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBlcnJub190b193c2FlcnJubygpOwotICAgICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX3NvY2tldDogZmFpbGVkICFcbiIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgfQotICAgIAotICAgIGlmIChzb2NrID4gV0lOU09DS19NQVhfU09DS0VUUykgewotCS8qIHdlIG9ubHkgc3VwcG9ydCBzb2NrZXQgbnVtYmVycyB1cCB0byBXSU5TT0NLX01BWF9TT0NLRVRTLgotCSAqIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIG5vIG1vcmUgZGVzY3JpcHRvcnMgYXJlIGF2YWlsYWJsZQotCSAqLwotICAgICAgICBXU0FTZXRMYXN0RXJyb3IoV1NBRU1GSUxFKTsKLQlyZXR1cm4gSU5WQUxJRF9TT0NLRVQ7Ci0gICAgfQotCi0gICAgRkRfU0VUKHNvY2ssICZmZF9pbl91c2UpOwotCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9zb2NrZXQ6IGZkICVkXG4iLCBzb2NrKTsKLSAgICByZXR1cm4gc29jazsKLX0KLQotLyoKLXN0cnVjdCBXSU5faG9zdGVudCAqCi0qLwotU0VHUFRSIFdJTlNPQ0tfZ2V0aG9zdGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBJTlQgbGVuLCBJTlQgdHlwZSkKLXsKLQlzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKLQotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfZ2V0aG9zdGJ5YWRkcjogcHRyICU4eCwgbGVuICVkLCB0eXBlICVkXG4iLCAoaW50KSBhZGRyLCBsZW4sIHR5cGUpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKChob3N0ID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIHR5cGUpKSA9PSBOVUxMKSB7Ci0JCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCX0gZWxzZSB7Ci0JCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0JfQotCUNPTlZFUlRfSE9TVEVOVCgmSGVhcC0+aG9zdGVudF9hZGRyLCBob3N0KTsKLQotCXJldHVybiBHRVRfU0VHX1BUUigmSGVhcC0+aG9zdGVudF9hZGRyKTsKLX0KLQotLyoKLXN0cnVjdCBXSU5faG9zdGVudCAqCi0qLwotU0VHUFRSIFdJTlNPQ0tfZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBob3N0ZW50ICpob3N0OwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9nZXRob3N0YnluYW1lOiAlc1xuIiwgbmFtZSk7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlpZiAoKGhvc3QgPSBnZXRob3N0YnluYW1lKG5hbWUpKSA9PSBOVUxMKSB7Ci0JCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCX0gZWxzZSB7Ci0JCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0JfQotCUNPTlZFUlRfSE9TVEVOVCgmSGVhcC0+aG9zdGVudF9uYW1lLCBob3N0KTsKLQotCXJldHVybiBHRVRfU0VHX1BUUigmSGVhcC0+aG9zdGVudF9uYW1lKTsKLX0KLQotSU5UIFdJTlNPQ0tfZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgSU5UIG5hbWVsZW4pCi17Ci0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9nZXRob3N0bmFtZTogbmFtZSAlcywgbGVuICVkXG4iLCBuYW1lLCBuYW1lbGVuKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLSAgICAgICAgCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JaWYgKGdldGhvc3RuYW1lKG5hbWUsIG5hbWVsZW4pIDwgMCkgewotCQlpZiAoZXJybm8gPT0gRUlOVkFMKQotCQkJV1NBU2V0TGFzdEVycm9yKFdTQUVGQVVMVCk7Ci0JCWVsc2UKLQkJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0gICAgICAgIAlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQlyZXR1cm4gMDsKLX0gICAgICAgICAgCi0KLS8qCi1zdHJ1Y3QgV0lOX3Byb3RvZW50ICoKLSovCi1TRUdQVFIgV0lOU09DS19nZXRwcm90b2J5bmFtZShjaGFyICpuYW1lKQotewotCXN0cnVjdCBwcm90b2VudCAqcHJvdG87Ci0KLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX2dldHByb3RvYnluYW1lOiBuYW1lICVzXG4iLCBuYW1lKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLSAgICAgICAgCXJldHVybiBOVUxMOwotCX0KLQotCWlmICgocHJvdG8gPSBnZXRwcm90b2J5bmFtZShuYW1lKSkgPT0gTlVMTCkgewotCQlpZiAoaF9lcnJubyA8IDApIHsKLSAgICAgICAgCQllcnJub190b193c2FlcnJubygpOwotCQl9IGVsc2UgewotCQkJaGVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCX0KLSAgICAgICAgCXJldHVybiBOVUxMOwotCX0KLQlDT05WRVJUX1BST1RPRU5UKCZIZWFwLT5wcm90b2VudF9uYW1lLCBwcm90byk7Ci0KLQlyZXR1cm4gR0VUX1NFR19QVFIoJkhlYXAtPnByb3RvZW50X25hbWUpOwotfQotCi0vKgotc3RydWN0IFdJTl9wcm90b2VudCAqCi0qLwotU0VHUFRSIFdJTlNPQ0tfZ2V0cHJvdG9ieW51bWJlcihJTlQgbnVtYmVyKQotewotCXN0cnVjdCBwcm90b2VudCAqcHJvdG87Ci0KLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX2dldHByb3RvYnludW1iZXI6IG51bSAlZFxuIiwgbnVtYmVyKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLSAgICAgICAgCXJldHVybiBOVUxMOwotCX0KLQotCWlmICgocHJvdG8gPSBnZXRwcm90b2J5bnVtYmVyKG51bWJlcikpID09IE5VTEwpIHsKLSNpZiAwCi0JCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCX0gZWxzZSB7Ci0JCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfQotI2VuZGlmCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT19EQVRBKTsKLSAgICAgICAgCXJldHVybiBOVUxMOwotCX0KLQlDT05WRVJUX1BST1RPRU5UKCZIZWFwLT5wcm90b2VudF9udW1iZXIsIHByb3RvKTsKLQotCXJldHVybiBHRVRfU0VHX1BUUigmSGVhcC0+cHJvdG9lbnRfbnVtYmVyKTsKLX0KLQotLyoKLXN0cnVjdCBXSU5fc2VydmVudCAqCi0qLwotU0VHUFRSIFdJTlNPQ0tfZ2V0c2VydmJ5bmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90bykKLXsKLQlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKLQotCWlmIChwcm90byA9PSBOVUxMKQotCQlwcm90byA9ICJ0Y3AiOwotCi0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9nZXRzZXJ2YnluYW1lOiBuYW1lICVzLCBwcm90byAlc1xuIiwgbmFtZSwgcHJvdG8pOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgewotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKChzZXJ2aWNlID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90bykpID09IE5VTEwpIHsKLQkJaWYgKGhfZXJybm8gPCAwKSB7Ci0gICAgICAgIAkJZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfSBlbHNlIHsKLQkJCWhlcnJub190b193c2FlcnJubygpOwotCQl9Ci0gICAgICAgIAlyZXR1cm4gTlVMTDsKLQl9Ci0JQ09OVkVSVF9TRVJWRU5UKCZIZWFwLT5zZXJ2ZW50X25hbWUsIHNlcnZpY2UpOwotCi0JcmV0dXJuIEdFVF9TRUdfUFRSKCZIZWFwLT5zZXJ2ZW50X25hbWUpOwotfQotCi0vKgotc3RydWN0IFdJTl9zZXJ2ZW50ICoKLSovCi1TRUdQVFIgV0lOU09DS19nZXRzZXJ2Ynlwb3J0KElOVCBwb3J0LCBjb25zdCBjaGFyICpwcm90bykKLXsKLQlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKLQotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfZ2V0c2VydmJ5cG9ydDogcG9ydCAlZCwgbmFtZSAlc1xuIiwgcG9ydCwgcHJvdG8pOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgewotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKChzZXJ2aWNlID0gZ2V0c2VydmJ5cG9ydChwb3J0LCBwcm90bykpID09IE5VTEwpIHsKLQkJaWYgKGhfZXJybm8gPCAwKSB7Ci0gICAgICAgIAkJZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJfSBlbHNlIHsKLQkJCWhlcnJub190b193c2FlcnJubygpOwotCQl9Ci0gICAgICAgIAlyZXR1cm4gTlVMTDsKLQl9Ci0JQ09OVkVSVF9TRVJWRU5UKCZIZWFwLT5zZXJ2ZW50X3BvcnQsIHNlcnZpY2UpOwotCi0JcmV0dXJuIEdFVF9TRUdfUFRSKCZIZWFwLT5zZXJ2ZW50X3BvcnQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKiogd2luc29jayBzcGVjaWZpYyBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICovCi1zdGF0aWMgSEFORExFMTYgbmV3X2hhbmRsZSA9IDE7Ci0KLXN0YXRpYyBIQU5ETEUxNiBBbGxvY1dTQUhhbmRsZSh2b2lkKQotewotCXJldHVybiBuZXdfaGFuZGxlKys7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlY3ZfbWVzc2FnZShpbnQgc2lnKQotewotCXN0YXRpYyBzdHJ1Y3QgaXBjX3BhY2tldCBtZXNzYWdlOwotCWludCBtZXNzYWdlX2lzX3ZhbGlkID0gMDsKLQlCT09MIHJlc3VsdDsKLQotCW1lc3NhZ2UubXR5cGUgPSBNVFlQRTsKLQotCXNpZ25hbChTSUdVU1IxLCByZWN2X21lc3NhZ2UpOwotCXdoaWxlICgxKSB7Ci0KLQkJaWYgKCFtZXNzYWdlX2lzX3ZhbGlkKSB7Ci0JCQlpZiAobXNncmN2KHdpbmVfa2V5LCAoc3RydWN0IG1zZ2J1ZiopJihtZXNzYWdlKSwgCi0JCQkJICAgSVBDX1BBQ0tFVF9TSVpFLCAwIC8qTVRZUEUqLywgSVBDX05PV0FJVCkgPT0gLTEpIHsKLQkJCQlwZXJyb3IoIndpbmU6IHdpbnNvY2s6IG1zZ3JjdiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmVzdWx0ID0gUG9zdE1lc3NhZ2UobWVzc2FnZS5oV25kLCBtZXNzYWdlLndNc2csCi0JCQkJICAgICAoV1BBUkFNMTYpbWVzc2FnZS5oYW5kbGUsIG1lc3NhZ2UubFBhcmFtKTsKLQkJaWYgKHJlc3VsdCAhPSBGQUxTRSkgewotCQkJbWVzc2FnZV9pc192YWxpZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQltZXNzYWdlX2lzX3ZhbGlkID0gMDsKLQkJCi0JfQotCQkKLSAgICBpZiAoKHdpbmVfa2V5ID0gbXNnZ2V0KElQQ19QUklWQVRFLCAwNjAwKSkgPT0gLTEpCi0JcGVycm9yKCJ3aW5lOiB3aW5zb2NrOiBtc2dnZXQiKTsgCi19Ci0KLQotc3RhdGljIHZvaWQgc2VuZF9tZXNzYWdlKCBIV05EIGhXbmQsIHVfaW50IHdNc2csIEhBTkRMRTE2IGhhbmRsZSwgbG9uZyBsUGFyYW0pCi17Ci0Jc3RydWN0IGlwY19wYWNrZXQgbWVzc2FnZTsKLQkKLQltZXNzYWdlLm10eXBlID0gTVRZUEU7Ci0JbWVzc2FnZS5oYW5kbGUgPSBoYW5kbGU7Ci0JbWVzc2FnZS5oV25kID0gaFduZDsKLQltZXNzYWdlLndNc2cgPSB3TXNnOwotCW1lc3NhZ2UubFBhcmFtID0gbFBhcmFtOwotCi0JaWYgKG1zZ3NuZCh3aW5lX2tleSwgKHN0cnVjdCBtc2didWYqKSYobWVzc2FnZSksICAKLQkJICAgSVBDX1BBQ0tFVF9TSVpFLCAwLypJUENfTk9XQUlUKi8pID09IC0xKQotCQlwZXJyb3IoIndpbmU6IHdpbnNvY2s6IG1zZ3NuZCIpOwotCi0Ja2lsbChnZXRwcGlkKCksIFNJR1VTUjEpOwotfQotCi0KLUhBTkRMRTE2IFdTQUFzeW5jR2V0SG9zdEJ5QWRkcihIV05EIGhXbmQsIHVfaW50IHdNc2csIExQQ1NUUiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbGVuLCBJTlQgdHlwZSwgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKQotewotCUhBTkRMRTE2IGhhbmRsZTsKLQlzdHJ1Y3QgaG9zdGVudCAqaG9zdDsKLQlpbnQgbmV3cGlkOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaGFuZGxlID0gQWxsb2NXU0FIYW5kbGUoKTsKLQotCW5ld3BpZCA9IGZvcmsoKTsKLQlpZiAobmV3cGlkKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJmb3JrZWQsIGNoaWxkIGlzICglZClcbiIsbmV3cGlkKTsKLQkJcmV0dXJuIGhhbmRsZTsKLQl9IGVsc2UgewotCQlpZiAoKGhvc3QgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGxlbiwgdHlwZSkpID09IE5VTEwpIHsKLQkJCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCQllcnJub190b193c2FlcnJubygpOwotCQkJfSBlbHNlIHsKLQkJCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJCX0KLQkJCXNlbmRfbWVzc2FnZShoV25kLCB3TXNnLCBoYW5kbGUsIHdzYWVycm5vKCkgPDwgMTYpOwotCQkJZXhpdCgwKTsKLQkJfQotCQltZW1jcHkoYnVmLCBob3N0LCBidWZsZW4pOwotCQlzZW5kX21lc3NhZ2UoaFduZCwgd01zZywgaGFuZGxlLCAwKTsKLQkJZXhpdCgwKTsKLQl9Ci19Ci0KLQotSEFORExFMTYgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKEhXTkQgaFduZCwgdV9pbnQgd01zZywgTFBDU1RSIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWYsIElOVCBidWZsZW4pCi17Ci0JSEFORExFMTYgaGFuZGxlOwotCXN0cnVjdCBob3N0ZW50ICpob3N0OwotCWludCBuZXdwaWQ7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQloYW5kbGUgPSBBbGxvY1dTQUhhbmRsZSgpOwotCi0JbmV3cGlkID0gZm9yaygpOwotCWlmIChuZXdwaWQpIHsKLQkJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgImZvcmtlZCwgY2hpbGQgaXMgKCVkKVxuIixuZXdwaWQpOwotCQlyZXR1cm4gaGFuZGxlOwotCX0gZWxzZSB7Ci0JCWlmICgoaG9zdCA9IGdldGhvc3RieW5hbWUobmFtZSkpID09IE5VTEwpIHsKLQkJCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCQllcnJub190b193c2FlcnJubygpOwotCQkJfSBlbHNlIHsKLQkJCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJCX0KLQkJCXNlbmRfbWVzc2FnZShoV25kLCB3TXNnLCBoYW5kbGUsIHdzYWVycm5vKCkgPDwgMTYpOwotCQkJZXhpdCgwKTsKLQkJfQotCQltZW1jcHkoYnVmLCBob3N0LCBidWZsZW4pOwotCQlzZW5kX21lc3NhZ2UoaFduZCwgd01zZywgaGFuZGxlLCAwKTsKLQkJZXhpdCgwKTsKLQl9Ci19ICAgICAgICAgICAgICAgICAgICAgCi0KLQotSEFORExFMTYgV1NBQXN5bmNHZXRQcm90b0J5TmFtZShIV05EIGhXbmQsIHVfaW50IHdNc2csIExQQ1NUUiBuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIGJ1ZiwgSU5UIGJ1ZmxlbikKLXsKLQlIQU5ETEUxNiBoYW5kbGU7Ci0Jc3RydWN0IHByb3RvZW50ICpwcm90bzsKLQlpbnQgbmV3cGlkOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaGFuZGxlID0gQWxsb2NXU0FIYW5kbGUoKTsKLQotCW5ld3BpZCA9IGZvcmsoKTsKLQlpZiAobmV3cGlkKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJmb3JrZWQsIGNoaWxkIGlzICglZClcbiIsbmV3cGlkKTsKLQkJcmV0dXJuIGhhbmRsZTsKLQl9IGVsc2UgewotCQlpZiAoKHByb3RvID0gZ2V0cHJvdG9ieW5hbWUobmFtZSkpID09IE5VTEwpIHsKLQkJCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCQllcnJub190b193c2FlcnJubygpOwotCQkJfSBlbHNlIHsKLQkJCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJCX0KLQkJCXNlbmRfbWVzc2FnZShoV25kLCB3TXNnLCBoYW5kbGUsIHdzYWVycm5vKCkgPDwgMTYpOwotCQkJZXhpdCgwKTsKLQkJfQotCQltZW1jcHkoYnVmLCBwcm90bywgYnVmbGVuKTsKLQkJc2VuZF9tZXNzYWdlKGhXbmQsIHdNc2csIGhhbmRsZSwgMCk7Ci0JCWV4aXQoMCk7Ci0JfQotfQotCi0KLUhBTkRMRTE2IFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcihIV05EIGhXbmQsIHVfaW50IHdNc2csIElOVCBudW1iZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBidWYsIElOVCBidWZsZW4pCi17Ci0JSEFORExFMTYgaGFuZGxlOwotCXN0cnVjdCBwcm90b2VudCAqcHJvdG87Ci0JaW50IG5ld3BpZDsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWhhbmRsZSA9IEFsbG9jV1NBSGFuZGxlKCk7Ci0KLQluZXdwaWQgPSBmb3JrKCk7Ci0JaWYgKG5ld3BpZCkgewotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiZm9ya2VkLCBjaGlsZCBpcyAoJWQpXG4iLG5ld3BpZCk7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfSBlbHNlIHsKLQkJaWYgKChwcm90byA9IGdldHByb3RvYnludW1iZXIobnVtYmVyKSkgPT0gTlVMTCkgewotCQkJaWYgKGhfZXJybm8gPCAwKSB7Ci0gICAgICAgIAkJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCQl9IGVsc2UgewotCQkJCWhlcnJub190b193c2FlcnJubygpOwotCQkJfQotCQkJc2VuZF9tZXNzYWdlKGhXbmQsIHdNc2csIGhhbmRsZSwgd3NhZXJybm8oKSA8PCAxNik7Ci0JCQlleGl0KDApOwotCQl9Ci0JCW1lbWNweShidWYsIHByb3RvLCBidWZsZW4pOwotCQlzZW5kX21lc3NhZ2UoaFduZCwgd01zZywgaGFuZGxlLCAwKTsKLQkJZXhpdCgwKTsKLQl9Ci19Ci0KLQotSEFORExFMTYgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKEhXTkQgaFduZCwgdV9pbnQgd01zZywgTFBDU1RSIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIExQU1RSIGJ1ZiwgSU5UIGJ1ZmxlbikKLXsKLQlIQU5ETEUxNiBoYW5kbGU7Ci0Jc3RydWN0IHNlcnZlbnQgKnNlcnZpY2U7Ci0JaW50IG5ld3BpZDsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiAwOwotCX0KLQotCWhhbmRsZSA9IEFsbG9jV1NBSGFuZGxlKCk7Ci0KLQluZXdwaWQgPSBmb3JrKCk7Ci0JaWYgKG5ld3BpZCkgewotCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiZm9ya2VkLCBjaGlsZCBpcyAoJWQpXG4iLG5ld3BpZCk7Ci0JCXJldHVybiBoYW5kbGU7Ci0JfSBlbHNlIHsKLQkJaWYgKChzZXJ2aWNlID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90bykpID09IE5VTEwpIHsKLQkJCWlmIChoX2Vycm5vIDwgMCkgewotICAgICAgICAJCQllcnJub190b193c2FlcnJubygpOwotCQkJfSBlbHNlIHsKLQkJCQloZXJybm9fdG9fd3NhZXJybm8oKTsKLQkJCX0KLQkJCXNlbmRfbWVzc2FnZShoV25kLCB3TXNnLCBoYW5kbGUsIHdzYWVycm5vKCkgPDwgMTYpOwotCQkJZXhpdCgwKTsKLQkJfQotCQltZW1jcHkoYnVmLCBzZXJ2aWNlLCBidWZsZW4pOwotCQlzZW5kX21lc3NhZ2UoaFduZCwgd01zZywgaGFuZGxlLCAwKTsKLQkJZXhpdCgwKTsKLQl9Ci19Ci0KLQotSEFORExFMTYgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0KEhXTkQgaFduZCwgdV9pbnQgd01zZywgSU5UIHBvcnQsIExQQ1NUUiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmLCBJTlQgYnVmbGVuKQotewotCUhBTkRMRTE2IGhhbmRsZTsKLQlzdHJ1Y3Qgc2VydmVudCAqc2VydmljZTsKLQlpbnQgbmV3cGlkOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaGFuZGxlID0gQWxsb2NXU0FIYW5kbGUoKTsKLQotCW5ld3BpZCA9IGZvcmsoKTsKLQlpZiAobmV3cGlkKSB7Ci0JCWRwcmludGZfd2luc29jayhzdGRkZWIsICJmb3JrZWQsIGNoaWxkIGlzICglZClcbiIsbmV3cGlkKTsKLQkJcmV0dXJuIGhhbmRsZTsKLQl9IGVsc2UgewotCQlpZiAoKHNlcnZpY2UgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIHByb3RvKSkgPT0gTlVMTCkgewotCQkJaWYgKGhfZXJybm8gPCAwKSB7Ci0gICAgICAgIAkJCWVycm5vX3RvX3dzYWVycm5vKCk7Ci0JCQl9IGVsc2UgewotCQkJCWhlcnJub190b193c2FlcnJubygpOwotCQkJfQotCQkJc2VuZF9tZXNzYWdlKGhXbmQsIHdNc2csIGhhbmRsZSwgd3NhZXJybm8oKSA8PCAxNik7Ci0JCQlleGl0KDApOwotCQl9Ci0JCW1lbWNweShidWYsIHNlcnZpY2UsIGJ1Zmxlbik7Ci0JCXNlbmRfbWVzc2FnZShoV25kLCB3TXNnLCBoYW5kbGUsIDApOwotCQlleGl0KDApOwotCX0KLX0KLQotSU5UIFdTQUFzeW5jU2VsZWN0KFNPQ0tFVCBzLCBIV05EIGhXbmQsIHVfaW50IHdNc2csIGxvbmcgbEV2ZW50KQotewotICAgIGxvbmcgZXZlbnQ7Ci0gICAgZmRfc2V0IHJlYWRfZmRzLCB3cml0ZV9mZHMsIGV4Y2VwdF9mZHM7Ci0gICAgaW50IGVycm9ycyA9IDA7Ci0gICAgaW50IG5ld3BpZDsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9Bc3luY1NlbGVjdDogc29ja2V0ICVkLCBIV05EICUwNHgsIHdNc2cgJWQsIGV2ZW50ICVsZFxuIiwgcywgaFduZCwgd01zZywgbEV2ZW50KTsKLQotICAgIC8qIHJlbW92ZSBvdXRzdGFuZGluZyBhc3luY3NlbGVjdCgpIHByb2Nlc3NlcyAqLwotICAgIC8qIGtpbGwgKi8KLQotICAgIGlmICh3TXNnID09IDAgJiYgbEV2ZW50ID09IDApIAotICAgICAgICByZXR1cm4gMDsKLQotICAgIG5ld3BpZCA9IGZvcmsoKTsKLSAgICBpZiAobmV3cGlkKSB7Ci0gICAgICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJmb3JrZWQsIGNoaWxkIGlzICglZClcbiIsbmV3cGlkKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIEZEX1pFUk8oJnJlYWRfZmRzKTsKLSAgICAgICAgICAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7Ci0gICAgICAgICAgICBGRF9aRVJPKCZleGNlcHRfZmRzKTsKLQotICAgICAgICAgICAgaWYgKGxFdmVudCAmIEZEX1JFQUQpCi0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZyZWFkX2Zkcyk7Ci0gICAgICAgICAgICBpZiAobEV2ZW50ICYgRkRfV1JJVEUpCi0gICAgICAgICAgICAgICAgRkRfU0VUKHMsICZ3cml0ZV9mZHMpOwotCi0gICAgICAgICAgICBmY250bChzLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICAgICAgICAgIGlmIChzZWxlY3QocyArIDEsICZyZWFkX2ZkcywgJndyaXRlX2ZkcywgJmV4Y2VwdF9mZHMsIE5VTEwpPDApIHsKLSAgICAgICAgICAgICAgICBlcnJvcnMgPSB3c2FlcnJubygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBldmVudCA9IDA7Ci0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJnJlYWRfZmRzKSkKLSAgICAgICAgICAgICAgICBldmVudCB8PSBGRF9SRUFEOwotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZ3cml0ZV9mZHMpKQotICAgICAgICAgICAgICAgIGV2ZW50IHw9IEZEX1dSSVRFOwotICAgICAgICAgICAgc2VuZF9tZXNzYWdlKGhXbmQsIHdNc2csIHMsIFdTQU1BS0VTRUxFQ1RSRVBMWShldmVudCxlcnJvcnMpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotSU5UIFdTQUZESXNTZXQoU09DS0VUIGZkLCBXaW5Tb2NrX2ZkX3NldCAqc2V0KQotewotICBpbnQgaSA9IHNldC0+ZmRfY291bnQ7Ci0gIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiX19XU0FGRElzU2V0KCVkLCU4bHgpXG4iLGZkLCh1bnNpZ25lZCBsb25nKXNldCk7Ci0gICAgCi0gIHdoaWxlIChpLS0pCi0gICAgewotICAgICAgaWYgKHNldC0+ZmRfYXJyYXlbaV0gPT0gZmQpCi0gICAgICAgIHsKLSAgICAgICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiX19XU0FGRElzU2V0IHJldHVybmluZyAxXG4iKTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldCByZXR1cm5pbmcgMFxuIik7Ci0gIHJldHVybiAwOwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1JTlQgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KEhBTkRMRTE2IGhBc3luY1Rhc2tIYW5kbGUpCi17Ci0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9Bc3luY1JlcXVlc3Q6IGhhbmRsZSAlMDR4XG4iLCBoQXN5bmNUYXNrSGFuZGxlKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBTT0NLRVRfRVJST1I7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLUlOVCBXU0FDYW5jZWxCbG9ja2luZ0NhbGwodm9pZCkKLXsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX0NhbmNlbEJsb2NrQ2FsbFxuIik7Ci0KLQlpZiAoIXdzYV9pbml0dGVkKSB7IAotCQlXU0FTZXRMYXN0RXJyb3IoV1NBTk9USU5JVElBTElTRUQpOwotCQlyZXR1cm4gU09DS0VUX0VSUk9SOwotCX0KLQotCXJldHVybiAwOwotfQotICAgICAgICAgIAotSU5UIFdTQUdldExhc3RFcnJvcih2b2lkKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfR2V0TGFzdEVycm9yID0gJXhcbiIsIHdzYV9lcnJubyk7Ci0KLQlyZXR1cm4gd3NhX2Vycm5vOwotfQotCi12b2lkIFdTQVNldExhc3RFcnJvcihJTlQgaUVycm9yKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfU2V0TGFzdEVyb3JyICVkXG4iLCBpRXJyb3IpOwotCi0JLyogdGVjaG5pY2FsbHksIHdlIHNob3VsZCBtYWtlIHN1cmUgdGhhdCBXSU5FU29ja2V0cyAKLQkqIGhhcyBiZWVuIHN0YXJ0ZWQgdXAgY29ycmVjdGx5LiBCdXQgc2luY2UgdGhpcyBmdW5jdGlvbgotCSogaXMgYWxzbyB1c2VkIGludGVybmFsbHksIGl0IG1ha2VzIG5vIHNlbnNlLgotCSoKLQkqaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkqCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JKglyZXR1cm4gU09DS0VUX0VSUk9SOwotCSp9Ci0JKi8KLQotCXdzYV9lcnJubyA9IGlFcnJvcjsKLX0KLQotQk9PTCBXU0FJc0Jsb2NraW5nKHZvaWQpCi17Ci0JZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQV9Jc0Jsb2NraW5nXG4iKTsKLQotCXJldHVybiAwOwotfQotCi1GQVJQUk9DMTYgV1NBU2V0QmxvY2tpbmdIb29rKEZBUlBST0MxNiBscEJsb2NrRnVuYykKLXsKLQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBX1NldEJsb2NrSG9vayAlOGx4LCBTVFVCIVxuIiwgKHVuc2lnbmVkIGxvbmcpIGxwQmxvY2tGdW5jKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUJsb2NrRnVuY3Rpb24gPSBscEJsb2NrRnVuYzsKLQotCXJldHVybiAoRkFSUFJPQzE2KSBscEJsb2NrRnVuYzsKLX0KLQotSU5UIFdTQVVuaG9va0Jsb2NraW5nSG9vayh2b2lkKQotewotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FfVW5ob29rQmxvY2tpbmdIb29rXG4iKTsKLQotCWlmICghd3NhX2luaXR0ZWQpIHsgCi0JCVdTQVNldExhc3RFcnJvcihXU0FOT1RJTklUSUFMSVNFRCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCUJsb2NrRnVuY3Rpb24gPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiAwCi1XU0FEQVRBIFdJTlNPQ0tfZGF0YSA9IHsKLSAgICAgICAgMHgwMTAxLAotICAgICAgICAweDAxMDEsCi0gICAgICAgICJXSU5FIFNvY2tldHMiLAotI2lmZGVmIGxpbnV4Ci0gICAgICAgICJMSU5VWC9pMzg2IiwKLSNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKLSAgICAgICAgIk5ldEJTRC9pMzg2IiwKLSNlbGlmIGRlZmluZWQoc3Vub3MpCi0JIlN1bk9TIiwKLSNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCi0JIkZyZWVCU0QiLAotI2Vsc2UKLQkiVW5rbm93biIsCi0jZW5kaWYKLSAgICAgICAgV0lOU09DS19NQVhfU09DS0VUUywKLQlXSU5TT0NLX01BWF9VRFBERywKLSAgICAgICAgTlVMTAotfTsKLSNlbmRpZgotCi1JTlQgV1NBU3RhcnR1cChXT1JEIHdWZXJzaW9uUmVxdWVzdGVkLCBMUFdTQURBVEEgbHBXU0FEYXRhKQotewotCi0JV1NBREFUQSBXSU5TT0NLX2RhdGEgPSB7Ci0gICAgICAgIAkJCTB4MDEwMSwKLSAgICAgICAgCQkJMHgwMTAxLAotICAgICAgICAJCQkiV0lORSBTb2NrZXRzIiwKLQkJCSNpZmRlZiBsaW51eAotICAgICAgICAJCQkiTGludXgvaTM4NiIsCi0JCQkjZWxpZiBkZWZpbmVkKF9fTmV0QlNEX18pCi0gICAgICAgIAkJCSJOZXRCU0QvaTM4NiIsCi0JCQkjZWxpZiBkZWZpbmVkKHN1bm9zKQotCQkJCSJTdW5PUyIsCi0JCQkjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQotCQkJCSJGcmVlQlNEIiwKLQkJCSNlbHNlCi0JCQkJIlVua25vd24iLAotCQkJI2VuZGlmCi0gICAgICAgIAkJCVdJTlNPQ0tfTUFYX1NPQ0tFVFMsCi0JCQkJV0lOU09DS19NQVhfVURQREcsCi0JCQkJTlVMTAotCQkJCX07Ci0KLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NBU3RhcnR1cDogdmVyUmVxPSV4XG4iLCB3VmVyc2lvblJlcXVlc3RlZCk7Ci0KLSAgICBpZiAoTE9CWVRFKHdWZXJzaW9uUmVxdWVzdGVkKSA8IDEgfHwKLSAgICAgICAgKExPQllURSh3VmVyc2lvblJlcXVlc3RlZCkgPT0gMSAmJgotICAgICAgICAgSElCWVRFKHdWZXJzaW9uUmVxdWVzdGVkKSA8IDEpKQotCXJldHVybiBXU0FWRVJOT1RTVVBQT1JURUQ7Ci0KLSAgICBpZiAoIWxwV1NBRGF0YSkKLSAgICAgICAgcmV0dXJuIFdTQUVJTlZBTDsKLQotCS8qIGFsbG9jIHdpbnNvY2sgaGVhcCAqLwotCi0gICAgaWYgKChIZWFwSGFuZGxlID0gR2xvYmFsQWxsb2MxNihHTUVNX0ZJWEVELHNpemVvZihzdHJ1Y3QgV2luU29ja0hlYXApKSkgPT0gMCkKLQlyZXR1cm4gV1NBU1lTTk9UUkVBRFk7Ci0KLSAgICBIZWFwID0gKHN0cnVjdCBXaW5Tb2NrSGVhcCAqKSBHbG9iYWxMb2NrMTYoSGVhcEhhbmRsZSk7Ci0KLSAgICAvKiByZXR1cm4gd2luc29jayBpbmZvcm1hdGlvbiAqLwotICAgIG1lbWNweShscFdTQURhdGEsICZXSU5TT0NLX2RhdGEsIHNpemVvZihXSU5TT0NLX2RhdGEpKTsgCi0KLSAgICAvKiBpcGMgc3R1ZmYgKi8KLQotICAgIGlmICgod2luZV9rZXkgPSBtc2dnZXQoSVBDX1BSSVZBVEUsIDA2MDApKSA9PSAtMSkKLQlwZXJyb3IoIndpbmU6IHdpbnNvY2s6IG1zZ2dldCIpOyAKLQotICAgIHNpZ25hbChTSUdVU1IxLCByZWN2X21lc3NhZ2UpOwotCi0gICAgLyogY2xlYXIgKi8KLSAgICAKLSAgICBGRF9aRVJPKCZmZF9pbl91c2UpOwotCi0gICAgLyogaW5jcmVtZW50IG91ciB1c2FnZSBjb3VudCAqLwotICAgIHdzYV9pbml0dGVkKys7Ci0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTQVN0YXJ0dXA6IHN1Y2NlZWRlZFxuIik7Ci0gICAgcmV0dXJuKDApOwotfQotCi1JTlQgV1NBQ2xlYW51cCh2b2lkKQotewotCWludCBmZDsKLQotCWRwcmludGZfd2luc29jayhzdGRkZWIsICJXU0FDbGVhbnVwICglZClcbiIsZ2V0cGlkKCkpOwotCi0JaWYgKCF3c2FfaW5pdHRlZCkgeyAKLQkJV1NBU2V0TGFzdEVycm9yKFdTQU5PVElOSVRJQUxJU0VEKTsKLQkJcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQl9Ci0KLQkvKiBkZWNyZW1lbnQgdXNhZ2UgY291bnQgKi8KLQl3c2FfaW5pdHRlZC0tOwotCi0JaWYgKHdzYV9pbml0dGVkID09IDApIHsKLQkJaWYgKHdpbmVfa2V5KQotCQkJaWYgKG1zZ2N0bCh3aW5lX2tleSwgSVBDX1JNSUQsIE5VTEwpID09IC0xKQotCQkJCXBlcnJvcigid2luZTogd2luc29jazogbXNnY3RsIik7Ci0KLQkJZm9yIChmZCA9IDA7IGZkICE9IEZEX1NFVFNJWkU7IGZkKyspCi0JCQlpZiAoRkRfSVNTRVQoZmQsICZmZF9pbl91c2UpKQotCQkJCWNsb3NlKGZkKTsKLQotCX0KLQlyZXR1cm4gMDsKLX0KLQotVk9JRAotV3NDb250cm9sKERXT1JEIHgxLERXT1JEIHgyLExQRFdPUkQgeDMsTFBEV09SRCB4NCxMUERXT1JEIHg1LExQRFdPUkQgeDYpIHsKLQlmcHJpbnRmKHN0ZG5pbXAsIldzQ29udHJvbCglbHgsJWx4LCVwLCVwLCVwLCVwKVxuIiwKLQkJeDEseDIseDMseDQseDUseDYKLQkpOwotCWZwcmludGYoc3RkbmltcCwiV3NDb250cm9sKHgseCwlbHgsJWx4LCVseCwlbHgpXG4iLAotCQl4Mz8qeDM6MCx4ND8qeDQ6MCx4NT8qeDU6MCx4Nj8qeDY6MAotCSk7Ci0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnQyMS5jIGIvbWlzY2VtdS9pbnQyMS5jCmluZGV4IDFhNGNjOTYuLmQyYTVmYjUgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW50MjEuYworKysgYi9taXNjZW11L2ludDIxLmMKQEAgLTY0OSw3ICs2NDksNiBAQAogICAgIH0KIAogICAgIGxzdHJjcHluMzJBKCBwdHIsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIDY0ICk7Ci0gICAgaWYgKCFwdHJbMF0pIHN0cmNweSggcHRyLCAiXFwiICk7CiAgICAgcmV0dXJuIDE7CiB9CiAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCBjOGEwNjZhMS4uNDRjNGJiNCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtOTEsNyArOTEsNyBAQAogCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwogCWlmIChobW1pbyA9PSAwKSB7CiAJCWRwcmludGZfbW1zeXMoc3RkZGViLCAic25kUGxheVNvdW5kIC8vIHNlYXJjaGluZyBpbiBTeXN0ZW1Tb3VuZCBMaXN0ICFcbiIpOwotCQlHZXRQcm9maWxlU3RyaW5nKCJTb3VuZHMiLCAoTFBTVFIpbHBzelNvdW5kTmFtZSwgIiIsIHN0ciwgc2l6ZW9mKHN0cikpOworCQlHZXRQcm9maWxlU3RyaW5nMzJBKCJTb3VuZHMiLCAoTFBTVFIpbHBzelNvdW5kTmFtZSwgIiIsIHN0ciwgc2l6ZW9mKHN0cikpOwogCQlpZiAoc3RybGVuKHN0cikgPT0gMCkgcmV0dXJuIEZBTFNFOwogCQlpZiAoIChwdHIgPSAoTFBTVFIpc3RyY2hyKHN0ciwgJywnKSkgIT0gTlVMTCkgKnB0ciA9ICdcMCc7CiAJCWhtbWlvID0gbW1pb09wZW4oc3RyLCBOVUxMLCBNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEIHwgTU1JT19ERU5ZV1JJVEUpOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJCXM9KGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRWxlbWVudE5hbWUpOwogCQl0PXN0cnJjaHIocywnLicpOwogCQlpZiAodCkgewotCQkJR2V0UHJvZmlsZVN0cmluZygibWNpIGV4dGVuc2lvbnMiLHQrMSwiKiIsc3RyLHNpemVvZihzdHIpKTsKKwkJCUdldFByb2ZpbGVTdHJpbmczMkEoIm1jaSBleHRlbnNpb25zIix0KzEsIioiLHN0cixzaXplb2Yoc3RyKSk7CiAJCQlBbnNpVXBwZXIoc3RyKTsKIAkJCWlmIChzdHJjbXAoc3RyLCAiQ0RBVURJTyIpID09IDApIHsKIAkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfQ0RfQVVESU87CkBAIC03NDUsNyArNzQ1LDcgQEAKIAkJCQlJbnN0YWxsZWRDb3VudCA9IDA7CiAJCQkJSW5zdGFsbGVkTGlzdExlbiA9IDA7CiAJCQkJcHRyID0gbHBJbnN0YWxsTmFtZXMgPSB4bWFsbG9jKDIwNDgpOwotCQkJCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOworCQkJCUdldFByaXZhdGVQcm9maWxlU3RyaW5nMzJBKCJtY2kiLCBOVUxMLCAiIiwgbHBJbnN0YWxsTmFtZXMsIDIwMDAsIFN5c0ZpbGUpOwogCQkJCXdoaWxlKHN0cmxlbihwdHIpID4gMCkgewogCQkJCQlkcHJpbnRmX21jaShzdGRkZWIsICItLS0+ICclcycgXG4iLCBwdHIpOwogCQkJCQlsZW4gPSBzdHJsZW4ocHRyKSArIDE7CmRpZmYgLS1naXQgYS9vYmplY3RzL2NsaXBwaW5nLmMgYi9vYmplY3RzL2NsaXBwaW5nLmMKaW5kZXggYzdmNTVmYy4uNzg3OTkxYiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jbGlwcGluZy5jCisrKyBiL29iamVjdHMvY2xpcHBpbmcuYwpAQCAtNDE4LDYgKzQxOCwyNCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldENsaXBSZ24zMiAgKEdESTMyLjE2MykKKyAqLworSU5UMzIgR2V0Q2xpcFJnbjMyKCBIREMzMiBoZGMsIEhSR04zMiBoUmduICkKK3sKKyAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpZiggZGMgJiYgaFJnbiApCisgICAgICBpZiggZGMtPncuaENsaXBSZ24gKQorICAgICAgeyAKKwkvKiB0aGlzIGFzc3VtZXMgdGhhdCBkYy0+dy5oQ2xpcFJnbiBpcyBpbiBjb29yZGluYXRlcworCSAgIHJlbGF0aXZlIHRvIHRoZSBEQyBvcmlnaW4gKG5vdCBkZXZpY2UpICovCisKKwlpZiggQ29tYmluZVJnbjMyKGhSZ24sIGRjLT53LmhDbGlwUmduLCAwLCBSR05fQ09QWSkgIT0gRVJST1IgKQorCSAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBTYXZlVmlzUmduICAgIChHREkuMTI5KQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kYy5jIGIvb2JqZWN0cy9kYy5jCmluZGV4IDgzNGUwZjguLjcwYzAzNTUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGMuYworKysgYi9vYmplY3RzL2RjLmMKQEAgLTcxOSwxOSArNzE5LDM2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RENPcmdFeCAgKEdESTMyLjE2OCkKKyAqLworQk9PTDMyIEdldERDT3JnRXgoSERDMzIgaERDLCBMUFBPSU5UMzIgbHBwKQoreworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaERDLCBEQ19NQUdJQyApOworICAgIGlmICghZGMgfHwgIWxwcCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCEoZGMtPncuZmxhZ3MgJiBEQ19NRU1PUlkpKQorICAgIHsKKyAgICAgICBXaW5kb3cgcm9vdDsKKyAgICAgICBpbnQgdywgaCwgYm9yZGVyLCBkZXB0aDsKKworICAgICAgIFhHZXRHZW9tZXRyeSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgJnJvb3QsCisgICAgICAgICAgICAgICAgICAgICZscHAtPngsICZscHAtPnksICZ3LCAmaCwgJmJvcmRlciwgJmRlcHRoICk7CisgICAgfQorICAgIGVsc2UgbHBwLT54ID0gbHBwLT55ID0gMDsKKyAgICBscHAtPnggKz0gZGMtPncuRENPcmdYOyBscHAtPnkgKz0gZGMtPncuRENPcmdZOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERDT3JnICAgIChHREkuNzkpCiAgKi8KIERXT1JEIEdldERDT3JnKCBIREMxNiBoZGMgKQogewotICAgIFdpbmRvdyByb290OwotICAgIGludCB4LCB5LCB3LCBoLCBib3JkZXIsIGRlcHRoOwotCi0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgaWYgKCFkYykgcmV0dXJuIDA7Ci0gICAgaWYgKGRjLT53LmZsYWdzICYgRENfTUVNT1JZKSByZXR1cm4gMDsKLSAgICBYR2V0R2VvbWV0cnkoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsICZyb290LAotCQkgICZ4LCAmeSwgJncsICZoLCAmYm9yZGVyLCAmZGVwdGggKTsKLSAgICByZXR1cm4gTUFLRUxPTkcoIGRjLT53LkRDT3JnWCArIChXT1JEKXgsIGRjLT53LkRDT3JnWSArIChXT1JEKXkgKTsKKyAgICBQT0lOVDMyCXB0OworICAgIGlmKCBHZXREQ09yZ0V4KCBoZGMsICZwdCkgKQorICAJcmV0dXJuIE1BS0VMT05HKCAoV09SRClwdC54LCAoV09SRClwdC55ICk7ICAgIAorICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL29iamVjdHMvZGN2YWx1ZXMuYyBiL29iamVjdHMvZGN2YWx1ZXMuYwppbmRleCBlMzI5OTZhLi5iNDk3NTU4IDEwMDY0NAotLS0gYS9vYmplY3RzL2RjdmFsdWVzLmMKKysrIGIvb2JqZWN0cy9kY3ZhbHVlcy5jCkBAIC04Niw3ICs4Niw2IEBACiBEQ19HRVRfWF9ZKCBEV09SRCwgR2V0V2luZG93T3JnLCBXbmRPcmdYLCBXbmRPcmdZICkgICAgICAgICAgICAgICAvKiBHREkuOTcgKi8KIERDX0dFVF9WQUwoIEhSR04zMiwgSW5xdWlyZVZpc1JnbiwgaFZpc1JnbiApICAgICAgICAgICAgICAgICAgICAgIC8qIEdESS4xMzEgKi8KIERDX0dFVF9YX1koIERXT1JELCBHZXRCcnVzaE9yZywgYnJ1c2hPcmdYLCBicnVzaE9yZ1kgKSAgICAgICAgICAgIC8qIEdESS4xNDkgKi8KLURDX0dFVF9WQUwoIEhSR04zMiwgR2V0Q2xpcFJnbiwgaENsaXBSZ24gKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdESS4xNzMgKi8KIERDX0dFVF9WQUwoIFdPUkQsIEdldFRleHRBbGlnbiwgdGV4dEFsaWduICkgICAgICAgICAgICAgICAgICAgICAgIC8qIEdESS4zNDUgKi8KIERDX0dFVF9WQUwoIEhGT05UMTYsIEdldEN1ckxvZ0ZvbnQsIGhGb250ICkgICAgICAgICAgICAgICAgICAgICAgIC8qIEdESS40MTEgKi8KIERDX0dFVF9WQUxfRVgoIEdldEJydXNoT3JnRXgsIGJydXNoT3JnWCwgYnJ1c2hPcmdZICkgICAgICAgICAgICAgIC8qIEdESS40NjkgKi8KQEAgLTk1LDMgKzk0LDkgQEAKIERDX0dFVF9WQUxfRVgoIEdldFZpZXdwb3J0T3JnRXgsIFZwb3J0T3JnWCwgVnBvcnRPcmdZICkgICAgICAgICAgIC8qIEdESS40NzMgKi8KIERDX0dFVF9WQUxfRVgoIEdldFdpbmRvd0V4dEV4LCBXbmRFeHRYLCBXbmRFeHRZICkgICAgICAgICAgICAgICAgIC8qIEdESS40NzQgKi8KIERDX0dFVF9WQUxfRVgoIEdldFdpbmRvd09yZ0V4LCBXbmRPcmdYLCBXbmRPcmdZICkgICAgICAgICAgICAgICAgIC8qIEdESS40NzUgKi8KKworLyogdGhpcyBvbmUgaXMgd3JvbmcgLSBXaW5kb3dzIHJldHVybnMgcmVnaW9uIHRoYXQKKyAgIGlzIHJlbGF0aXZlIHRvIHRoZSBkZXZpY2UgYW5kIG5vdCB0byB0aGUgREMgb3JpZ2luICovCisKK0RDX0dFVF9WQUwoIEhSR04xNiwgR2V0Q2xpcFJnbjE2LCBoQ2xpcFJnbiApICAgICAgICAgICAgICAgICAgICAgIC8qIEdESS4xNzMgKi8KKwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCBkZjNiMTA5Li4wNjFlNWNjIDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtOTQsNyArOTQsOCBAQAogICAgIEZvbnROYW1lc1s0XS53aW5kb3cgPSAiYXJpYWwiOyBGb250TmFtZXNbNF0ueDExID0gIiotaGVsdmV0aWNhIjsKICAgICBGb250TmFtZXNbNV0ud2luZG93ID0gImhlbHYiOyBGb250TmFtZXNbNV0ueDExID0gIiotaGVsdmV0aWNhIjsKICAgICBGb250TmFtZXNbNl0ud2luZG93ID0gInJvbWFuIjsgRm9udE5hbWVzWzZdLngxMSA9ICIqLXRpbWVzIjsKLSAgICBGb250U2l6ZSA9IDc7CisgICAgRm9udE5hbWVzWzddLndpbmRvdyA9ICJzeXN0ZW0iOyBGb250TmFtZXNbN10ueDExID0gIiotaGVsdmV0aWNhIjsKKyAgICBGb250U2l6ZSA9IDg7CiAgIH0KICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjAsNiArMjIxLDIwIEBACiAgICAgICBmYW1pbHkgPSAiKi0qIjsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBzcHJpbnRmKCBwYXR0ZXJuLCAiLSVzLSVzLSotbm9ybWFsLSotKi0qLSotKi0qLSotJXMiLAorCSAgICBmYW1pbHksIHdlaWdodCwgY2hhcnNldCk7CisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkZPTlRfTWF0Y2hGb250OiAnJXMnXG4iLCBwYXR0ZXJuICk7CisgICAgbmFtZXMgPSBYTGlzdEZvbnRzKCBkaXNwbGF5LCBwYXR0ZXJuLCAxLCAmY291bnQgKTsKKyAgICBpZiAobmFtZXMpIFhGcmVlRm9udE5hbWVzKCBuYW1lcyApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAoZmFtaWx5LCAiKi0qIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGT05UX01hdGNoRm9udCglcykgOiByZXR1cm5pbmcgTlVMTFxuIiwgcGF0dGVybik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGZhbWlseSA9ICIqLSoiOworICAgIH0KICAgICBvbGRoZWlnaHQgPSBoZWlnaHQ7CiAgICAgb2xkc3BhY2luZyA9IHNwYWNpbmc7CiAgICAgd2hpbGUgKFRSVUUpIHsKQEAgLTExOTcsMTMzICsxMjEyLDE0NSBAQAogICBYRnJlZUZvbnROYW1lcyhuYW1lcyk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCUVudW1Gb250cwkJCVtHREkuNzBdCisgKiBXZSByZXVzZSBFbnVtRm9udEZhbWlsaWVzKiBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGdldCB0aGUgc2FtZQorICogc3RydWN0cyAoKyBleHRyYSBzdHVmZiBhdCB0aGUgZW5kIHdoaWNoIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgZW51bSBmdW5jcykKICAqLwotSU5UIEVudW1Gb250cyhIREMxNiBoREMsIExQQ1NUUiBscEZhY2VOYW1lLCBGT05URU5VTVBST0MxNiBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQorSU5UMTYgRW51bUZvbnRzMTYoSERDMTYgaERDLCBMUENTVFIgbHBGYWNlTmFtZSwgRk9OVEVOVU1QUk9DMTYgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKIHsKLSAgSExPQ0FMMTYgICAgIGhMb2c7Ci0gIEhMT0NBTDE2ICAgICBoTWV0OwotICBIRk9OVDE2IGhGb250OwotICBIRk9OVDE2IGhPbGRGb250OwotICBMUExPR0ZPTlQxNiAgbHBMb2dGb250OwotICBMUFRFWFRNRVRSSUMxNiBscHRtOwotICBMUFNUUgkgICAgICAgbHBPbGROYW1lOwotICBjaGFyCSAgICAgICBGYWNlTmFtZVtMRl9GQUNFU0laRV07Ci0gIGludCAgICAgICAgICBuUmV0ID0gMDsKLSAgaW50ICAgICAgICAgIGk7Ci0KLSAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRzKCUwNHgsICVwPSclcycsICUwOGx4LCAlMDhseClcbiIsIAotCSAgICAgICBoREMsIGxwRmFjZU5hbWUsIGxwRmFjZU5hbWUsIChMT05HKWxwRW51bUZ1bmMsIGxwRGF0YSk7Ci0gIGlmIChscEVudW1GdW5jID09IDApIHJldHVybiAwOwotICBoTG9nID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihMT0dGT05UMTYpICsgTEZfRkFDRVNJWkUgKTsKLSAgbHBMb2dGb250ID0gKExQTE9HRk9OVDE2KSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKLSAgaWYgKGxwTG9nRm9udCA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250cyAvLyBjYW4ndCBhbGxvYyBMT0dGT05UIHN0cnVjdCAhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihURVhUTUVUUklDMTYpICk7Ci0gIGxwdG0gPSAoTFBURVhUTUVUUklDMTYpIEdESV9IRUFQX0xJTl9BRERSKGhNZXQpOwotICBpZiAobHB0bSA9PSBOVUxMKSB7Ci0gICAgR0RJX0hFQVBfRlJFRShoTG9nKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVudW1Gb250cyAvLyBjYW4ndCBhbGxvYyBURVhUTUVUUklDIHN0cnVjdCAhXG4iKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobHBGYWNlTmFtZSAhPSBOVUxMKSB7Ci0gICAgc3RyY3B5KEZhY2VOYW1lLCBscEZhY2VOYW1lKTsKLSAgICBBbnNpVXBwZXIoRmFjZU5hbWUpOwotICB9IAotICBscE9sZE5hbWUgPSBOVUxMOwotICAKLSAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwotICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgaWYgKGxwRmFjZU5hbWUgPT0gTlVMTCkgewotICAgICAgaWYgKGxwT2xkTmFtZSAhPSBOVUxMKSB7Ci0JaWYgKHN0cmNtcChscE9sZE5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkgPT0gMCkgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBscE9sZE5hbWUgPSBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyY21wKEZhY2VOYW1lLCBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSAhPSAwKSBjb250aW51ZTsKLSAgICB9Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRzIC8vIGVudW0gJyVzJyAhXG4iLCBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKTsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udHMgLy8gJXAgIVxuIiwgbHBMb2dGb250TGlzdFtpXSk7Ci0gICAgbWVtY3B5KGxwTG9nRm9udCwgbHBMb2dGb250TGlzdFtpXSwgc2l6ZW9mKExPR0ZPTlQxNikgKyBMRl9GQUNFU0laRSk7Ci0gICAgaEZvbnQgPSBDcmVhdGVGb250SW5kaXJlY3QxNihscExvZ0ZvbnQpOwotICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaERDLCBoRm9udCk7Ci0gICAgR2V0VGV4dE1ldHJpY3MxNihoREMsIGxwdG0pOwotICAgIFNlbGVjdE9iamVjdDMyKGhEQywgaE9sZEZvbnQpOwotICAgIERlbGV0ZU9iamVjdDMyKGhGb250KTsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udHMgLy8gaT0lZCBscExvZ0ZvbnQ9JXAgbHB0bT0lcFxuIiwgaSwgbHBMb2dGb250LCBscHRtKTsKLSAgICBuUmV0ID0gbHBFbnVtRnVuYyggR0RJX0hFQVBfU0VHX0FERFIoaExvZyksIEdESV9IRUFQX1NFR19BRERSKGhNZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAwLCAoTE9ORylscERhdGEgKTsKLSAgICBpZiAoblJldCA9PSAwKSB7Ci0gICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udHMgLy8gRW51bUVuZCByZXF1ZXN0ZWQgYnkgYXBwbGljYXRpb24gIVxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgR0RJX0hFQVBfRlJFRShoTWV0KTsKLSAgR0RJX0hFQVBfRlJFRShoTG9nKTsKLSAgcmV0dXJuIG5SZXQ7CisgIHJldHVybiBFbnVtRm9udEZhbWlsaWVzMTYoaERDLGxwRmFjZU5hbWUsbHBFbnVtRnVuYyxscERhdGEpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJRW51bUZvbnRzQQkJCVtHREkzMi44NF0KKyAqLworSU5UMzIgRW51bUZvbnRzMzJBKEhEQzMyIGhEQywgTFBDU1RSIGxwRmFjZU5hbWUsIEZPTlRFTlVNUFJPQzMyQSBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQoreworICByZXR1cm4gRW51bUZvbnRGYW1pbGllczMyQShoREMsbHBGYWNlTmFtZSxscEVudW1GdW5jLGxwRGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlFbnVtRm9udHNBCQkJW0dESTMyLjg0XQorICovCitJTlQzMiBFbnVtRm9udHMzMlcoSERDMzIgaERDLCBMUENXU1RSIGxwRmFjZU5hbWUsIEZPTlRFTlVNUFJPQzMyVyBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQoreworICByZXR1cm4gRW51bUZvbnRGYW1pbGllczMyVyhoREMsbHBGYWNlTmFtZSxscEVudW1GdW5jLGxwRGF0YSk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlFbnVtRm9udEZhbWlsaWVzCVtHREkuMzMwXQogICovCiBJTlQxNiBFbnVtRm9udEZhbWlsaWVzMTYoSERDMTYgaERDLCBMUENTVFIgbHBzekZhbWlseSwgRk9OVEVOVU1QUk9DMTYgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKIHsKKyAgTE9HRk9OVDE2CUxGOworCisgIGlmIChscHN6RmFtaWx5KQorICAgICBzdHJjcHkoTEYubGZGYWNlTmFtZSxscHN6RmFtaWx5KTsKKyAgZWxzZQorICAgICBMRi5sZkZhY2VOYW1lWzBdPSdcMCc7CisgIExGLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKworICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MTYoaERDLCZMRiwoRk9OVEVOVU1QUk9DRVgxNilscEVudW1GdW5jLGxwRGF0YSwwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCUVudW1Gb250RmFtaWxpZXNBCVtHREkzMi44MF0KKyAqLworSU5UMzIgRW51bUZvbnRGYW1pbGllczMyQShIREMzMiBoREMsIExQQ1NUUiBscHN6RmFtaWx5LCBGT05URU5VTVBST0MzMkEgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSkKK3sKKyAgTE9HRk9OVDMyQQlMRjsKKworICBpZiAobHBzekZhbWlseSkKKyAgICAgc3RyY3B5KExGLmxmRmFjZU5hbWUsbHBzekZhbWlseSk7CisgIGVsc2UKKyAgICAgTEYubGZGYWNlTmFtZVswXT0nXDAnOworICBMRi5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7CisKKyAgcmV0dXJuIEVudW1Gb250RmFtaWxpZXNFeDMyQShoREMsJkxGLChGT05URU5VTVBST0NFWDMyQSlscEVudW1GdW5jLGxwRGF0YSwwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCUVudW1Gb250RmFtaWxpZXNXCVtHREkzMi44M10KKyAqLworSU5UMzIgRW51bUZvbnRGYW1pbGllczMyVyhIREMzMiBoREMsIExQQ1dTVFIgbHBzekZhbWlseVcsIEZPTlRFTlVNUFJPQzMyVyBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQoreworICBMT0dGT05UMzJXCUxGOworCisgIGlmIChscHN6RmFtaWx5VykKKyAgCWxzdHJjcHkzMlcoTEYubGZGYWNlTmFtZSxscHN6RmFtaWx5Vyk7CisgIGVsc2UKKyAgCUxGLmxmRmFjZU5hbWVbMF09MDsKKyAgTEYubGZDaGFyU2V0ID0gREVGQVVMVF9DSEFSU0VUOworICByZXR1cm4gRW51bUZvbnRGYW1pbGllc0V4MzJXKGhEQywmTEYsKEZPTlRFTlVNUFJPQ0VYMzJXKWxwRW51bUZ1bmMsbHBEYXRhLDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJRW51bUZvbnRGYW1pbGllc0V4CVtHREkuNjE4XQorICogRklYTUU6IGZpbGwgdGhlIHJlc3Qgb2YgdGhlIE5FV1RFWFRNRVRSSUNFWCBhbmQgRU5VTUxPR0ZPTlRFWCBzdHJ1Y3R1cmVzLgorICogICAgICAgIChhcHBsaWVzIHRvIGFsbCBFbnVtRm9udEZhbWlsaWVzRXgqKQorICogICAgICAgIHdpbmVsaWIvMTYgc3VwcG9ydC4KKyAqLworSU5UMTYgRW51bUZvbnRGYW1pbGllc0V4MTYoSERDMTYgaERDLCBMUExPR0ZPTlQxNiBscExGLCBGT05URU5VTVBST0NFWDE2IGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEsRFdPUkQgcmVzZXJ2ZWQpCit7CiAgIEhMT0NBTDE2ICAgICAJaExvZzsKICAgSExPQ0FMMTYgICAgIAloTWV0OwogICBIRk9OVDE2IGhGb250OwogICBIRk9OVDE2IGhPbGRGb250OwotICBMUEVOVU1MT0dGT05UMTYgbHBFbnVtTG9nRm9udDsKLSAgTFBURVhUTUVUUklDMTYgbHB0bTsKKyAgTFBFTlVNTE9HRk9OVEVYMTYgbHBFbnVtTG9nRm9udDsKKyAgTFBORVdURVhUTUVUUklDRVgxNiBscHRtOwogICBMUFNUUgkgICAgICAgCWxwT2xkTmFtZTsKICAgY2hhcgkgICAgICAgCUZhY2VOYW1lW0xGX0ZBQ0VTSVpFXTsKICAgaW50CSAgICAgICAJblJldCA9IDA7CiAgIGludAkgICAgICAgCWk7CiAgIAotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzKCUwNHgsICVwLCAlMDhseCwgJTA4bHgpXG4iLAotCSAgICAgICBoREMsIGxwc3pGYW1pbHksIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzRXgoJTA0eCwgJyVzJywgJTA4bHgsICUwOGx4LCAlMDhseClcbiIsCisJICAgICAgIGhEQywgbHBMRi0+bGZGYWNlTmFtZSwgKERXT1JEKWxwRW51bUZ1bmMsIGxwRGF0YSwgcmVzZXJ2ZWQpOwogICBpZiAobHBFbnVtRnVuYyA9PSAwKSByZXR1cm4gMDsKLSAgaExvZyA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoRU5VTUxPR0ZPTlQxNikgKTsKLSAgbHBFbnVtTG9nRm9udCA9IChMUEVOVU1MT0dGT05UMTYpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOworICBoTG9nID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihFTlVNTE9HRk9OVEVYMTYpICk7CisgIGxwRW51bUxvZ0ZvbnQgPSAoTFBFTlVNTE9HRk9OVEVYMTYpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOwogICBpZiAobHBFbnVtTG9nRm9udCA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXMgLy8gY2FuJ3QgYWxsb2MgTE9HRk9OVCBzdHJ1Y3QgIVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXNFeCAvLyBjYW4ndCBhbGxvYyBMT0dGT05UIHN0cnVjdCAhXG4iKTsKICAgICByZXR1cm4gMDsKICAgfQotICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihURVhUTUVUUklDMTYpICk7Ci0gIGxwdG0gPSAoTFBURVhUTUVUUklDMTYpIEdESV9IRUFQX0xJTl9BRERSKGhNZXQpOworICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihORVdURVhUTUVUUklDRVgxNikgKTsKKyAgbHB0bSA9IChMUE5FV1RFWFRNRVRSSUNFWDE2KSBHRElfSEVBUF9MSU5fQUREUihoTWV0KTsKICAgaWYgKGxwdG0gPT0gTlVMTCkgewogICAgIEdESV9IRUFQX0ZSRUUoaExvZyk7Ci0gICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXMgLy8gY2FuJ3QgYWxsb2MgVEVYVE1FVFJJQyBzdHJ1Y3QgIVxuIik7CisgICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXNFeCAvLyBjYW4ndCBhbGxvYyBURVhUTUVUUklDIHN0cnVjdCAhXG4iKTsKICAgICByZXR1cm4gMDsKICAgfQogICBscE9sZE5hbWUgPSBOVUxMOwotICBpZiAobHBzekZhbWlseSAhPSBOVUxMKSB7Ci0gICAgc3RyY3B5KEZhY2VOYW1lLCBscHN6RmFtaWx5KTsKLSAgICBBbnNpVXBwZXIoRmFjZU5hbWUpOwotICB9CisgIHN0cmNweShGYWNlTmFtZSxscExGLT5sZkZhY2VOYW1lKTsKKyAgQW5zaVVwcGVyKGxwTEYtPmxmRmFjZU5hbWUpOworCiAgIGlmIChscExvZ0ZvbnRMaXN0WzBdID09IE5VTEwpIEluaXRGb250c0xpc3QoKTsKICAgZm9yKGkgPSAwOyBscExvZ0ZvbnRMaXN0W2ldICE9IE5VTEw7IGkrKykgewotICAgIGlmIChscHN6RmFtaWx5ID09IE5VTEwpIHsKLSAgICAgIGlmIChscE9sZE5hbWUgIT0gTlVMTCkgewotCWlmIChzdHJjbXAobHBPbGROYW1lLGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpID09IDApIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgbHBPbGROYW1lID0gbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZTsKKyAgICAvKiBsZkNoYXJTZXQgKi8KKyAgICBpZiAobHBMRi0+bGZDaGFyU2V0IT1ERUZBVUxUX0NIQVJTRVQpCisgICAgCWlmIChscExvZ0ZvbnRMaXN0W2ldLT5sZkNoYXJTZXQgIT0gbHBMRi0+bGZDaGFyU2V0KQorCSAgIGNvbnRpbnVlOworCisgICAgLyogbGZQaXRjaEFuZEZhbWlseSBvbmx5IG9mIGltcG9ydGFuY2UgaW4gSGVicmV3IGFuZCBBcmFiaWMgdmVyc2lvbnMuICovCisgICAgLyogbGZGYWNlTmFtZSAqLworICAgIGlmIChGYWNlTmFtZVswXSkgeworICAgIAlpZiAoc3RyY21wKEZhY2VOYW1lLGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpKQorCSAgIGNvbnRpbnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyY21wKEZhY2VOYW1lLCBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSAhPSAwKSBjb250aW51ZTsKKyAgICAJaWYgKChscE9sZE5hbWUhPU5VTEwpJiYhc3RyY21wKGxwT2xkTmFtZSxscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSkKKwkgICBjb250aW51ZTsKKwlscE9sZE5hbWU9bHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZTsKICAgICB9CisKICAgICBtZW1jcHkobHBFbnVtTG9nRm9udCwgbHBMb2dGb250TGlzdFtpXSwgc2l6ZW9mKExPR0ZPTlQxNikpOwogICAgIHN0cmNweShscEVudW1Mb2dGb250LT5lbGZGdWxsTmFtZSwiIik7CiAgICAgc3RyY3B5KGxwRW51bUxvZ0ZvbnQtPmVsZlN0eWxlLCIiKTsKICAgICBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDE2KChMUExPR0ZPTlQxNilscEVudW1Mb2dGb250KTsKICAgICBoT2xkRm9udCA9IFNlbGVjdE9iamVjdDMyKGhEQywgaEZvbnQpOwotICAgIEdldFRleHRNZXRyaWNzMTYoaERDLCBscHRtKTsKKyAgICBHZXRUZXh0TWV0cmljczE2KGhEQywgKExQVEVYVE1FVFJJQzE2KWxwdG0pOwogICAgIFNlbGVjdE9iamVjdDMyKGhEQywgaE9sZEZvbnQpOwogICAgIERlbGV0ZU9iamVjdDMyKGhGb250KTsKLSAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiRW51bUZvbnRGYW1pbGllcyAvLyBpPSVkIGxwTG9nRm9udD0lcCBscHRtPSVwXG4iLCBpLCBscEVudW1Mb2dGb250LCBscHRtKTsKKyAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCAiRW51bUZvbnRGYW1pbGllc0V4IC8vIGk9JWQgbHBMb2dGb250PSVwIGxwdG09JXBcbiIsIGksIGxwRW51bUxvZ0ZvbnQsIGxwdG0pOwogICAgIAogICAgIG5SZXQgPSBscEVudW1GdW5jKCBHRElfSEVBUF9TRUdfQUREUihoTG9nKSwgR0RJX0hFQVBfU0VHX0FERFIoaE1ldCksCiAgICAgICAgICAgICAgICAgICAgICAgIDAsIGxwRGF0YSApOwpAQCAtMTMzOCw2NiArMTM2NSw3NCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJRW51bUZvbnRGYW1pbGllc0EJW0dESTMyLjgwXQorICoJCQkJRW51bUZvbnRGYW1pbGllc0V4QQlbR0RJMzIuODFdCisgKiBGSVhNRTogRG9uJ3QgdXNlIDE2IGJpdCBHREkgaGVhcCBmdW5jdGlvbnMgKGFwcGxpZXMgdG8gRW51bUZvbnRGYW1pbGllc0V4MzIqKQogICovCi1JTlQzMiBFbnVtRm9udEZhbWlsaWVzMzJBKEhEQzMyIGhEQywgTFBDU1RSIGxwc3pGYW1pbHksIEZPTlRFTlVNUFJPQzMyQSBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQorSU5UMzIgRW51bUZvbnRGYW1pbGllc0V4MzJBKEhEQzMyIGhEQywgTFBMT0dGT05UMzJBIGxwTEYsRk9OVEVOVU1QUk9DRVgzMkEgbHBFbnVtRnVuYywgTFBBUkFNIGxwRGF0YSxEV09SRCByZXNlcnZlZCkKIHsKICAgSExPQ0FMMTYgICAgIAloTG9nOwogICBITE9DQUwxNiAgICAgCWhNZXQ7CiAgIEhGT05UMzIJaEZvbnQ7CiAgIEhGT05UMzIJaE9sZEZvbnQ7Ci0gIExQRU5VTUxPR0ZPTlQzMkEJbHBFbnVtTG9nRm9udDsKLSAgTFBURVhUTUVUUklDMzJBCWxwdG07CisgIExQRU5VTUxPR0ZPTlRFWDMyQQlscEVudW1Mb2dGb250OworICBMUE5FV1RFWFRNRVRSSUNFWDMyQQlscHRtOwogICBMUFNUUgkgICAgICAgCWxwT2xkTmFtZTsKICAgY2hhcgkgICAgICAgCUZhY2VOYW1lW0xGX0ZBQ0VTSVpFXTsKICAgaW50CSAgICAgICAJblJldCA9IDA7CiAgIGludAkgICAgICAgCWk7CiAgIAotICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzMzJBKCUwNHgsICVwLCAlMDhseCwgJTA4bHgpXG4iLAotCSAgICAgICBoREMsIGxwc3pGYW1pbHksIChEV09SRClscEVudW1GdW5jLCBscERhdGEpOworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzMzJBKCUwNHgsICVwLCAlMDhseCwgJTA4bHgsICUwOGx4KVxuIiwKKwkgICAgICAgaERDLCBscExGLT5sZkZhY2VOYW1lLCAoRFdPUkQpbHBFbnVtRnVuYywgbHBEYXRhLHJlc2VydmVkKTsKICAgaWYgKGxwRW51bUZ1bmMgPT0gMCkgcmV0dXJuIDA7Ci0gIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKEVOVU1MT0dGT05UMzJBKSApOwotICBscEVudW1Mb2dGb250ID0gKExQRU5VTUxPR0ZPTlQzMkEpIEdESV9IRUFQX0xJTl9BRERSKGhMb2cpOworICBoTG9nID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihFTlVNTE9HRk9OVEVYMzJBKSApOworICBscEVudW1Mb2dGb250ID0gKExQRU5VTUxPR0ZPTlRFWDMyQSkgR0RJX0hFQVBfTElOX0FERFIoaExvZyk7CiAgIGlmIChscEVudW1Mb2dGb250ID09IE5VTEwpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwiRW51bUZvbnRGYW1pbGllcyAvLyBjYW4ndCBhbGxvYyBMT0dGT05UIHN0cnVjdCAhXG4iKTsKICAgICByZXR1cm4gMDsKICAgfQotICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihURVhUTUVUUklDMzJBKSApOwotICBscHRtID0gKExQVEVYVE1FVFJJQzMyQSkgR0RJX0hFQVBfTElOX0FERFIoaE1ldCk7CisgIGhNZXQgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKE5FV1RFWFRNRVRSSUNFWDMyQSkgKTsKKyAgbHB0bSA9IChMUE5FV1RFWFRNRVRSSUNFWDMyQSkgR0RJX0hFQVBfTElOX0FERFIoaE1ldCk7CiAgIGlmIChscHRtID09IE5VTEwpIHsKICAgICBHRElfSEVBUF9GUkVFKGhMb2cpOwogICAgIGZwcmludGYoc3RkZXJyLCJFbnVtRm9udEZhbWlsaWVzMzJBIC8vIGNhbid0IGFsbG9jIFRFWFRNRVRSSUMgc3RydWN0ICFcbiIpOwogICAgIHJldHVybiAwOwogICB9CiAgIGxwT2xkTmFtZSA9IE5VTEw7Ci0gIGlmIChscHN6RmFtaWx5ICE9IE5VTEwpIHsKLSAgICBzdHJjcHkoRmFjZU5hbWUsIGxwc3pGYW1pbHkpOwotICAgIEFuc2lVcHBlcihGYWNlTmFtZSk7Ci0gIH0KKyAgc3RyY3B5KEZhY2VOYW1lLGxwTEYtPmxmRmFjZU5hbWUpOworICBBbnNpVXBwZXIobHBMRi0+bGZGYWNlTmFtZSk7CisKICAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwogICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgaWYgKGxwc3pGYW1pbHkgPT0gTlVMTCkgewotICAgICAgaWYgKGxwT2xkTmFtZSAhPSBOVUxMKSB7Ci0JaWYgKHN0cmNtcChscE9sZE5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkgPT0gMCkgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBscE9sZE5hbWUgPSBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lOworICAgIC8qIGxmQ2hhclNldCAqLworICAgIGlmIChscExGLT5sZkNoYXJTZXQhPURFRkFVTFRfQ0hBUlNFVCkKKyAgICAJaWYgKGxwTG9nRm9udExpc3RbaV0tPmxmQ2hhclNldCAhPSBscExGLT5sZkNoYXJTZXQpCisJICAgY29udGludWU7CisKKyAgICAvKiBsZlBpdGNoQW5kRmFtaWx5IG9ubHkgb2YgaW1wb3J0YW5jZSBpbiBIZWJyZXcgYW5kIEFyYWJpYyB2ZXJzaW9ucy4gKi8KKyAgICAvKiBsZkZhY2VOYW1lICovCisgICAgaWYgKEZhY2VOYW1lWzBdKSB7CisgICAgCWlmIChzdHJjbXAoRmFjZU5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkpCisJICAgY29udGludWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIGlmIChzdHJjbXAoRmFjZU5hbWUsIGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpICE9IDApIGNvbnRpbnVlOworICAgIAlpZiAoKGxwT2xkTmFtZSE9TlVMTCkmJiFzdHJjbXAobHBPbGROYW1lLGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpKQorCSAgIGNvbnRpbnVlOworCWxwT2xkTmFtZT1scExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lOwogICAgIH0KKwogICAgIEZPTlRfTE9HRk9OVDE2VG9MT0dGT05UMzJBKGxwTG9nRm9udExpc3RbaV0sJihscEVudW1Mb2dGb250LT5lbGZMb2dGb250KSk7CiAgICAgc3RyY3B5KGxwRW51bUxvZ0ZvbnQtPmVsZkZ1bGxOYW1lLCIiKTsKICAgICBzdHJjcHkobHBFbnVtTG9nRm9udC0+ZWxmU3R5bGUsIiIpOworICAgIHN0cmNweShscEVudW1Mb2dGb250LT5lbGZTY3JpcHQsIiIpOwogICAgIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0MzJBKChMUExPR0ZPTlQzMkEpbHBFbnVtTG9nRm9udCk7CiAgICAgaE9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMihoREMsIGhGb250KTsKLSAgICBHZXRUZXh0TWV0cmljczMyQShoREMsIGxwdG0pOworICAgIEdldFRleHRNZXRyaWNzMzJBKGhEQywgKExQVEVYVE1FVFJJQzMyQSlscHRtKTsKICAgICBTZWxlY3RPYmplY3QzMihoREMsIGhPbGRGb250KTsKICAgICBEZWxldGVPYmplY3QzMihoRm9udCk7Ci0gICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkVudW1Gb250RmFtaWxpZXMzMkEgLy8gaT0lZCBscExvZ0ZvbnQ9JXAgbHB0bT0lcFxuIiwgaSwgbHBFbnVtTG9nRm9udCwgbHB0bSk7CisgICAgZHByaW50Zl9mb250KHN0ZGRlYiwgIkVudW1Gb250RmFtaWxpZXNFeDMyQSAvLyBpPSVkIGxwTG9nRm9udD0lcCBscHRtPSVwXG4iLCBpLCBscEVudW1Mb2dGb250LCBscHRtKTsKICAgICAKLSAgICBuUmV0ID0gbHBFbnVtRnVuYyggR0RJX0hFQVBfTElOX0FERFIoaExvZyksIEdESV9IRUFQX0xJTl9BRERSKGhNZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAwLCBscERhdGEgKTsKKyAgICBuUmV0ID0gbHBFbnVtRnVuYyhscEVudW1Mb2dGb250LGxwdG0sMCxscERhdGEpOwogICAgIGlmIChuUmV0ID09IDApIHsKLSAgICAgIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250RmFtaWxpZXMzMkEgLy8gRW51bUVuZCByZXF1ZXN0ZWQgYnkgYXBwbGljYXRpb24gIVxuIik7CisgICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzRXgzMkEgLy8gRW51bUVuZCByZXF1ZXN0ZWQgYnkgYXBwbGljYXRpb24gIVxuIik7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KQEAgLTE0MDYsNjYgKzE0NDEsNzYgQEAKICAgcmV0dXJuIG5SZXQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUVudW1Gb250RmFtaWxpZXNXCVtHREkzMi44M10KKyAqCQkJCUVudW1Gb250RmFtaWxpZXNXCVtHREkzMi44Ml0KICAqLwotSU5UMzIgRW51bUZvbnRGYW1pbGllczMyVyhIREMzMiBoREMsIExQQ1dTVFIgbHBzekZhbWlseVcsIEZPTlRFTlVNUFJPQzMyVyBscEVudW1GdW5jLCBMUEFSQU0gbHBEYXRhKQorSU5UMzIgRW51bUZvbnRGYW1pbGllc0V4MzJXKEhEQzMyIGhEQywgTFBMT0dGT05UMzJXIGxwTEYsIEZPTlRFTlVNUFJPQ0VYMzJXIGxwRW51bUZ1bmMsIExQQVJBTSBscERhdGEsIERXT1JEIHJlc2VydmVkKQogewogICBITE9DQUwxNiAgICAgCWhMb2c7CiAgIEhMT0NBTDE2ICAgICAJaE1ldDsKICAgSEZPTlQzMgloRm9udDsKICAgSEZPTlQzMgloT2xkRm9udDsKLSAgTFBFTlVNTE9HRk9OVDMyVwlscEVudW1Mb2dGb250OwotICBMUFRFWFRNRVRSSUMzMlcJbHB0bTsKKyAgTFBFTlVNTE9HRk9OVEVYMzJXCWxwRW51bUxvZ0ZvbnQ7CisgIExQTkVXVEVYVE1FVFJJQ0VYMzJXCWxwdG07CiAgIExQU1RSCSAgICAgICAJbHBPbGROYW1lOwotICBjaGFyCSAgICAgICAJRmFjZU5hbWVbTEZfRkFDRVNJWkVdOwogICBpbnQJICAgICAgIAluUmV0ID0gMDsKICAgaW50CSAgICAgICAJaTsKLSAgTFBDU1RSCWxwc3pGYW1pbHk9bHBzekZhbWlseVc/U1RSSU5HMzJfRHVwVW5pVG9BbnNpKGxwc3pGYW1pbHlXKTpOVUxMOworICBMUFNUUglscHN6RmFtaWx5PVNUUklORzMyX0R1cFVuaVRvQW5zaShscExGLT5sZkZhY2VOYW1lKTsKICAgCi0gIGRwcmludGZfZm9udChzdGRkZWIsIkVudW1Gb250RmFtaWxpZXMzMlcoJTA0eCwgJXAsICUwOGx4LCAlMDhseClcbiIsCi0JICAgICAgIGhEQywgbHBzekZhbWlseSwgKERXT1JEKWxwRW51bUZ1bmMsIGxwRGF0YSk7Ci0gIGlmIChscEVudW1GdW5jID09IDApIHJldHVybiAwOwotICBoTG9nID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihFTlVNTE9HRk9OVDMyVykgKTsKLSAgbHBFbnVtTG9nRm9udCA9IChMUEVOVU1MT0dGT05UMzJXKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKLSAgaWYgKGxwRW51bUxvZ0ZvbnQgPT0gTlVMTCkgewotICAgIGZwcmludGYoc3RkZXJyLCJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIGNhbid0IGFsbG9jIExPR0ZPTlQgc3RydWN0ICFcbiIpOworICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJFbnVtRm9udEZhbWlsaWVzRXgzMlcoJTA0eCwgJXAsICUwOGx4LCAlMDhseCwgJTA4bHgpXG4iLAorCSAgICAgICBoREMsIGxwTEYsIChEV09SRClscEVudW1GdW5jLCBscERhdGEscmVzZXJ2ZWQpOworICBpZiAobHBFbnVtRnVuYyA9PSAwKSB7CisgICAgZnJlZShscHN6RmFtaWx5KTsKICAgICByZXR1cm4gMDsKICAgfQotICBoTWV0ID0gR0RJX0hFQVBfQUxMT0MoIHNpemVvZihURVhUTUVUUklDMzJXKSApOwotICBscHRtID0gKExQVEVYVE1FVFJJQzMyVykgR0RJX0hFQVBfTElOX0FERFIoaE1ldCk7CisgIGhMb2cgPSBHRElfSEVBUF9BTExPQyggc2l6ZW9mKEVOVU1MT0dGT05URVgzMlcpICk7CisgIGxwRW51bUxvZ0ZvbnQgPSAoTFBFTlVNTE9HRk9OVEVYMzJXKSBHRElfSEVBUF9MSU5fQUREUihoTG9nKTsKKyAgaWYgKGxwRW51bUxvZ0ZvbnQgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIGNhbid0IGFsbG9jIExPR0ZPTlQgc3RydWN0ICFcbiIpOworICAgIGZyZWUobHBzekZhbWlseSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaE1ldCA9IEdESV9IRUFQX0FMTE9DKCBzaXplb2YoTkVXVEVYVE1FVFJJQ0VYMzJXKSApOworICBscHRtID0gKExQTkVXVEVYVE1FVFJJQ0VYMzJXKSBHRElfSEVBUF9MSU5fQUREUihoTWV0KTsKICAgaWYgKGxwdG0gPT0gTlVMTCkgewogICAgIEdESV9IRUFQX0ZSRUUoaExvZyk7CiAgICAgZnByaW50ZihzdGRlcnIsIkVudW1Gb250RmFtaWxpZXMzMlcgLy8gY2FuJ3QgYWxsb2MgVEVYVE1FVFJJQyBzdHJ1Y3QgIVxuIik7CisgICAgZnJlZShscHN6RmFtaWx5KTsKICAgICByZXR1cm4gMDsKICAgfQogICBscE9sZE5hbWUgPSBOVUxMOwotICBpZiAobHBzekZhbWlseSAhPSBOVUxMKSB7Ci0gICAgc3RyY3B5KEZhY2VOYW1lLCBscHN6RmFtaWx5KTsKLSAgICBBbnNpVXBwZXIoRmFjZU5hbWUpOwotICB9CisgIEFuc2lVcHBlcihscHN6RmFtaWx5KTsKICAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwogICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0gICAgaWYgKGxwc3pGYW1pbHkgPT0gTlVMTCkgewotICAgICAgaWYgKGxwT2xkTmFtZSAhPSBOVUxMKSB7Ci0JaWYgKHN0cmNtcChscE9sZE5hbWUsbHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZSkgPT0gMCkgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBscE9sZE5hbWUgPSBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lOworICAgIC8qIGxmQ2hhclNldCAqLworICAgIGlmIChscExGLT5sZkNoYXJTZXQhPURFRkFVTFRfQ0hBUlNFVCkKKyAgICAJaWYgKGxwTG9nRm9udExpc3RbaV0tPmxmQ2hhclNldCAhPSBscExGLT5sZkNoYXJTZXQpCisJICAgY29udGludWU7CisKKyAgICAvKiBsZlBpdGNoQW5kRmFtaWx5IG9ubHkgb2YgaW1wb3J0YW5jZSBpbiBIZWJyZXcgYW5kIEFyYWJpYyB2ZXJzaW9ucy4gKi8KKyAgICAvKiBsZkZhY2VOYW1lICovCisgICAgaWYgKGxwc3pGYW1pbHlbMF0pIHsKKyAgICAJaWYgKHN0cmNtcChscHN6RmFtaWx5LGxwTG9nRm9udExpc3RbaV0tPmxmRmFjZU5hbWUpKQorCSAgIGNvbnRpbnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyY21wKEZhY2VOYW1lLCBscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSAhPSAwKSBjb250aW51ZTsKKyAgICAJaWYgKChscE9sZE5hbWUhPU5VTEwpJiYhc3RyY21wKGxwT2xkTmFtZSxscExvZ0ZvbnRMaXN0W2ldLT5sZkZhY2VOYW1lKSkKKwkgICBjb250aW51ZTsKKwlscE9sZE5hbWU9bHBMb2dGb250TGlzdFtpXS0+bGZGYWNlTmFtZTsKICAgICB9CisKICAgICBGT05UX0xPR0ZPTlQxNlRvTE9HRk9OVDMyVyhscExvZ0ZvbnRMaXN0W2ldLCYobHBFbnVtTG9nRm9udC0+ZWxmTG9nRm9udCkpOwogICAgIGxzdHJjcHluQXRvVyhscEVudW1Mb2dGb250LT5lbGZGdWxsTmFtZSwiIiwxKTsKICAgICBsc3RyY3B5bkF0b1cobHBFbnVtTG9nRm9udC0+ZWxmU3R5bGUsIiIsMSk7CisgICAgbHN0cmNweW5BdG9XKGxwRW51bUxvZ0ZvbnQtPmVsZlNjcmlwdCwiIiwxKTsKICAgICBoRm9udCA9IENyZWF0ZUZvbnRJbmRpcmVjdDMyVygoTFBMT0dGT05UMzJXKWxwRW51bUxvZ0ZvbnQpOwogICAgIGhPbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaERDLCBoRm9udCk7Ci0gICAgR2V0VGV4dE1ldHJpY3MzMlcoaERDLCBscHRtKTsKKyAgICBHZXRUZXh0TWV0cmljczMyVyhoREMsIChMUFRFWFRNRVRSSUMzMlcpbHB0bSk7CiAgICAgU2VsZWN0T2JqZWN0MzIoaERDLCBoT2xkRm9udCk7CiAgICAgRGVsZXRlT2JqZWN0MzIoaEZvbnQpOwogICAgIGRwcmludGZfZm9udChzdGRkZWIsICJFbnVtRm9udEZhbWlsaWVzMzJXIC8vIGk9JWQgbHBMb2dGb250PSVwIGxwdG09JXBcbiIsIGksIGxwRW51bUxvZ0ZvbnQsIGxwdG0pOwogICAgIAotICAgIG5SZXQgPSBscEVudW1GdW5jKCBHRElfSEVBUF9MSU5fQUREUihoTG9nKSwgR0RJX0hFQVBfTElOX0FERFIoaE1ldCksCi0gICAgICAgICAgICAgICAgICAgICAgIDAsIGxwRGF0YSApOworICAgIG5SZXQgPSBscEVudW1GdW5jKGxwRW51bUxvZ0ZvbnQsbHB0bSwwLGxwRGF0YSk7CiAgICAgaWYgKG5SZXQgPT0gMCkgewogICAgICAgZHByaW50Zl9mb250KHN0ZGRlYiwiRW51bUZvbnRGYW1pbGllczMyVyAvLyBFbnVtRW5kIHJlcXVlc3RlZCBieSBhcHBsaWNhdGlvbiAhXG4iKTsKICAgICAgIGJyZWFrOwpAQCAtMTQ3Myw2ICsxNTE4LDcgQEAKICAgfQogICBHRElfSEVBUF9GUkVFKGhNZXQpOwogICBHRElfSEVBUF9GUkVFKGhMb2cpOworICBmcmVlKGxwc3pGYW1pbHkpOwogICByZXR1cm4gblJldDsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wZW4uYyBiL29iamVjdHMvcGVuLmMKaW5kZXggYmIxNDc5MS4uODNmNzBjNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wZW4uYworKysgYi9vYmplY3RzL3Blbi5jCkBAIC0xMyw3ICsxMyw3IEBACiAKIAogc3RhdGljIGNvbnN0IGNoYXIgUEVOX2Rhc2hbXSAgICAgICA9IHsgNSwzIH07ICAgICAgLyogLS0tLS0gICAtLS0tLSAgIC0tLS0tICAqLwotc3RhdGljIGNvbnN0IGNoYXIgUEVOX2RvdFtdICAgICAgICA9IHsgMiwyIH07ICAgICAgLyogLS0gIC0tICAtLSAgLS0gIC0tICAtLSAqLworc3RhdGljIGNvbnN0IGNoYXIgUEVOX2RvdFtdICAgICAgICA9IHsgMSwxIH07ICAgICAgLyogLS0gIC0tICAtLSAgLS0gIC0tICAtLSAqLwogc3RhdGljIGNvbnN0IGNoYXIgUEVOX2Rhc2hkb3RbXSAgICA9IHsgNCwzLDIsMyB9OyAgLyogLS0tLSAgIC0tICAgLS0tLSAgIC0tICAqLwogc3RhdGljIGNvbnN0IGNoYXIgUEVOX2Rhc2hkb3Rkb3RbXSA9IHsgNCwyLDIsMiwyLDIgfTsgLyogLS0tLSAgLS0gIC0tICAtLS0tICAqLwogCmRpZmYgLS1naXQgYS9vYmplY3RzL3RleHQuYyBiL29iamVjdHMvdGV4dC5jCmluZGV4IDc4MmZlNzAuLmZkMjQ1MGYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvdGV4dC5jCisrKyBiL29iamVjdHMvdGV4dC5jCkBAIC0yODMsNyArMjgzLDcgQEAKIAlyZWN0LT5yaWdodCA9IHJlY3QtPmxlZnQgKyBtYXhfd2lkdGg7CiAJcmVjdC0+Ym90dG9tID0geTsKICAgICB9Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIHkgLSByZWN0LT50b3A7CiB9CiAKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvd2luaGVscC93aW5oZWxwLmMgYi9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYwppbmRleCBhZWZkYTkwLi41NGUwYThkIDEwMDY0NAotLS0gYS9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYworKysgYi9wcm9ncmFtcy93aW5oZWxwL3dpbmhlbHAuYwpAQCAtNTkyLDcgKzU5Miw3IEBACiAgICAgICB7CiAJQk9PTCAgdXBkYXRlID0gVFJVRTsKIAlSRUNUICByZWN0OwotCUlOVDE2IE1pbiwgTWF4OworCUlOVCAgIE1pbiwgTWF4OwogCUlOVCAgIEN1clBvcyA9IEdldFNjcm9sbFBvcyhoV25kLCBTQl9WRVJUKTsKIAlHZXRTY3JvbGxSYW5nZShoV25kLCBTQl9WRVJULCAmTWluLCAmTWF4KTsKIAlHZXRDbGllbnRSZWN0KGhXbmQsICZyZWN0KTsKZGlmZiAtLWdpdCBhL3dpbjMyL2ZpbGUuYyBiL3dpbjMyL2ZpbGUuYwppbmRleCA5MjVkZTUxLi5lNjBiYzYxIDEwMDY0NAotLS0gYS93aW4zMi9maWxlLmMKKysrIGIvd2luMzIvZmlsZS5jCkBAIC02MCwyMCArNjAsMTYgQEAKICAgICAgICAgU2V0TGFzdEVycm9yKEVycm5vVG9MYXN0RXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgIH0KLSAgICBoZmlsZSA9IF9sY3JlYXQobHBOYW1lLDEpOwotICAgIGlmKGhmaWxlID09IEhGSUxFX0VSUk9SKSB7Ci0gICAgICAgIFNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICB9CiAgICAgZmlsZW1hcF9vYmo9KEZJTEVNQVBfT0JKRUNUICopQ3JlYXRlS2VybmVsT2JqZWN0KHNpemVvZihGSUxFTUFQX09CSkVDVCkpOwogICAgIGlmKGZpbGVtYXBfb2JqID09IE5VTEwpIHsKLSAgICAJX2xjbG9zZShoZmlsZSk7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9VTktOT1dOKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlmIChoPT1JTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAJaD1fbGNyZWF0KGxwTmFtZSwxKTsvKkZJWE1FKi8KIAogICAgIGZpbGVtYXBfb2JqLT5jb21tb24ubWFnaWMgPSBLRVJORUxfT0JKRUNUX0ZJTEVNQVA7Ci0gICAgZmlsZW1hcF9vYmotPmhmaWxlID0gaGZpbGU7CisgICAgZmlsZW1hcF9vYmotPmhmaWxlID0gaDsKICAgICBmaWxlbWFwX29iai0+cHJvdCA9IFRyYW5zbGF0ZVByb3RlY3Rpb25GbGFncyhwb3QpOwogICAgIGZpbGVtYXBfb2JqLT5zaXplID0gaGxvdzsKICAgICByZXR1cm4gKEhBTkRMRTMyKWZpbGVtYXBfb2JqOzsKQEAgLTk3LDcgKzkzLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTWFwVmlld09mRmlsZSAgICAgICAgICAgICAgICAgIChLRVJORUwzMi4zODUpCi0gKgogICovCiBMUFZPSUQgTWFwVmlld09mRmlsZShIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgRFdPUkQgb2ZmaGksCiAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb2ZmbG8sIERXT1JEIHNpemUpCkBAIC0xMTIsMTMgKzEwNywyNSBAQAogTFBWT0lEIE1hcFZpZXdPZkZpbGVFeChIQU5ETEUzMiBoYW5kbGUsIERXT1JEIGFjY2VzcywgRFdPUkQgb2ZmaGksCiAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgb2ZmbG8sIERXT1JEIHNpemUsIERXT1JEIHN0KQogewotICAgIGlmICghc2l6ZSkgc2l6ZSA9ICgoRklMRU1BUF9PQkpFQ1QgKiloYW5kbGUpLT5zaXplOwotICAgIHJldHVybiBtbWFwICgoY2FkZHJfdClzdCwgc2l6ZSwgKChGSUxFTUFQX09CSkVDVCAqKWhhbmRsZSktPnByb3QsIAorICAgIEZJTEVNQVBfT0JKRUNUICpmbWFwID0gKEZJTEVNQVBfT0JKRUNUKiloYW5kbGU7CisKKyAgICBpZiAoIXNpemUpIHNpemUgPSBmbWFwLT5zaXplOworICAgIGlmICghc2l6ZSkgc2l6ZSA9IDE7CisgICAgcmV0dXJuIG1tYXAgKChjYWRkcl90KXN0LCBzaXplLCBmbWFwLT5wcm90LCAKICAgICAgICAgICAgICAgICAgTUFQX0FOT058TUFQX1BSSVZBVEUsIAotCQkgRklMRV9HZXRVbml4SGFuZGxlKCgoRklMRU1BUF9PQkpFQ1QgKiloYW5kbGUpLT5oZmlsZSksCisJCSBGSUxFX0dldFVuaXhIYW5kbGUoZm1hcC0+aGZpbGUpLAogCQkgb2ZmbG8pOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBVbm1hcFZpZXdPZkZpbGUgICAgICAgICAgICAgICAgICAoS0VSTkVMMzIuMzg1KQorICovCitCT09MMzIgVW5tYXBWaWV3T2ZGaWxlKExQVk9JRCBhZGRyZXNzKSB7CisgICAgbXVubWFwKGFkZHJlc3MsLypobW0qLzEpOyAvKiBGSVhNRTogc2l6ZT8gKi8KKyAgICByZXR1cm4gVFJVRTsKK30KKworCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlICAgICAgIChLRVJORUwzMi4yMTkpCmRpZmYgLS1naXQgYS93aW5kb3dzL2NhcmV0LmMgYi93aW5kb3dzL2NhcmV0LmMKaW5kZXggOTljOTU1Zi4uMDU1YmIxYiAxMDA2NDQKLS0tIGEvd2luZG93cy9jYXJldC5jCisrKyBiL3dpbmRvd3MvY2FyZXQuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgQ2FyZXQueCA9IDA7CiAgICAgQ2FyZXQueSA9IDA7CiAKLSAgICBDYXJldC50aW1lb3V0ID0gR2V0UHJvZmlsZUludCggIndpbmRvd3MiLCAiQ3Vyc29yQmxpbmtSYXRlIiwgNzUwICk7CisgICAgQ2FyZXQudGltZW91dCA9IEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwgIkN1cnNvckJsaW5rUmF0ZSIsIDc1MCApOwogICAgIHJldHVybiBUUlVFOwogfQogICAgCmRpZmYgLS1naXQgYS93aW5kb3dzL2RjZS5jIGIvd2luZG93cy9kY2UuYwppbmRleCA1YTdjOWUwLi4xZjAzODMyIDEwMDY0NAotLS0gYS93aW5kb3dzL2RjZS5jCisrKyBiL3dpbmRvd3MvZGNlLmMKQEAgLTI4Miw3ICsyODIsOCBAQAogCiAgICAgICAvKiBHZXQgdmlzaWJsZSByZWN0YW5nbGUgYW5kIGNyZWF0ZSBhIHJlZ2lvbiB3aXRoIGl0LiAKICAgICAgICAqIGRvIHdlIHJlYWxseSBuZWVkIHRvIGNhbGN1bGF0ZSB2aXMgcmducyBmb3IgWCB3aW5kb3dzPyAKLSAgICAgICAqIC0geWVzLCB0byBjbGlwIGNoaWxkIHdpbmRvd3MuCisgICAgICAgKiAtIHllcywgdG8gY2xpcCBjaGlsZCB3aW5kb3dzIGJ1dCB3ZSBzaG91bGQgc2tpcCAKKyAgICAgICAqICAgc2libGluZ3MgaW4gdGhpcyBjYXNlLgogICAgICAgICovCiAKICAgICBpZiAoIXduZFB0ciB8fCAhRENFX0dldFZpc1JlY3QoIHduZFB0ciwgIShmbGFncyAmIERDWF9XSU5ET1cpLCAmcmVjdCApKQpAQCAtMzc3LDcgKzM3OCw0MSBAQAogICAgICAgICBkYy0+dS54LmRyYXdhYmxlID0gd25kUHRyLT53aW5kb3c7CiAgICAgfQogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRENFX0V4Y2x1ZGVSZ24KKyAqIAorICogIFRyYW5zbGF0ZSBnaXZlbiByZWdpb24gZnJvbSB0aGUgd25kIGNsaWVudCB0byB0aGUgREMgY29vcmRpbmF0ZXMKKyAqICBhbmQgYWRkIGl0IHRvIHRoZSBjbGlwcGluZyByZWdpb24uCisgKi8KK0lOVDE2IERDRV9FeGNsdWRlUmduKCBIREMzMiBoREMsIFdORCogd25kLCBIUkdOMzIgaFJnbiApCit7CisgIElOVDE2CSAgIHJldDsKKyAgUE9JTlQzMiAgcHQgPSB7MCwgMH07CisgIEhSR04zMiAgIGhSZ25DbGlwID0gR2V0Q2xpcFJnbjE2KCBoREMgKTsKKyAgRENFICAgICAqZGNlID0gZmlyc3REQ0U7CiAKKyAgd2hpbGUgKGRjZSAmJiAoZGNlLT5oREMgIT0gaERDKSkgZGNlID0gZGNlLT5uZXh0OworICBpZiggZGNlICkKKyAgeworICAgICAgTWFwV2luZG93UG9pbnRzMzIoIHduZC0+aHduZFNlbGYsIGRjZS0+aHduZEN1cnJlbnQsICZwdCwgMSk7CisgICAgICBpZiggZGNlLT5EQ1hmbGFncyAmIERDWF9XSU5ET1cgKQorICAgICAgeyAKKwkgIHduZCA9IFdJTl9GaW5kV25kUHRyKGRjZS0+aHduZEN1cnJlbnQpOworCSAgcHQueCArPSB3bmQtPnJlY3RDbGllbnQubGVmdCAtIHduZC0+cmVjdFdpbmRvdy5sZWZ0OworCSAgcHQueSArPSB3bmQtPnJlY3RDbGllbnQudG9wIC0gd25kLT5yZWN0V2luZG93LnRvcDsKKyAgICAgIH0KKyAgfQorICBlbHNlIHJldHVybiBFUlJPUjsKKyAgT2Zmc2V0UmduMzIoaFJnbiwgcHQueCwgcHQueSk7CisgIGlmKCBoUmduQ2xpcCApIHJldCA9IENvbWJpbmVSZ24zMiggaFJnbkNsaXAsIGhSZ25DbGlwLCBoUmduLCBSR05fRElGRiApOworICBlbHNlIAorICB7CisgICAgICBoUmduQ2xpcCA9IElucXVpcmVWaXNSZ24oIGhEQyApOworICAgICAgcmV0ID0gQ29tYmluZVJnbjMyKCBoUmduLCBoUmduQ2xpcCwgaFJnbiwgUkdOX0RJRkYgKTsKKyAgICAgIFNlbGVjdENsaXBSZ24zMiggaERDLCBoUmduICk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0RENFeDE2ICAgIChVU0VSLjM1OSkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IDAzYjgyYzMuLmIyMDE4ODEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMzc2LDcgKzM3Niw3IEBACiAgICAgICAgIGlmICh3UGFyYW0gJiYgd25kUHRyLT50ZXh0KQogICAgICAgICB7CiAgICAgICAgICAgICBsc3RyY3B5bjMyQSggKExQU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIHduZFB0ci0+dGV4dCwgd1BhcmFtICk7Ci0gICAgICAgICAgICByZXN1bHQgPSAoTFJFU1VMVClzdHJsZW4oIChMUFNUUilQVFJfU0VHX1RPX0xJTihsUGFyYW0pICkgKyAxOworICAgICAgICAgICAgcmVzdWx0ID0gKExSRVNVTFQpc3RybGVuKCAoTFBTVFIpUFRSX1NFR19UT19MSU4obFBhcmFtKSApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC00NDIsNyArNDQyLDcgQEAKICAgICAgICAgaWYgKHdQYXJhbSAmJiB3bmRQdHItPnRleHQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxzdHJjcHluMzJBKCAoTFBTVFIpbFBhcmFtLCB3bmRQdHItPnRleHQsIHdQYXJhbSApOwotICAgICAgICAgICAgcmVzdWx0ID0gKExSRVNVTFQpc3RybGVuKCAoTFBTVFIpbFBhcmFtICkgKyAxOworICAgICAgICAgICAgcmVzdWx0ID0gKExSRVNVTFQpc3RybGVuKCAoTFBTVFIpbFBhcmFtICk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGlhbG9nLmMgYi93aW5kb3dzL2RpYWxvZy5jCmluZGV4IDAzYTBkZGYuLjdmNTE2NjYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGlhbG9nLmMKKysrIGIvd2luZG93cy9kaWFsb2cuYwpAQCAtNCwxMSArNCwxMyBAQAogICogQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAorI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCisjaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAibGR0LmgiCkBAIC0xNiw2ICsxOCw3IEBACiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCisjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtNTM0LDggKzUzNywyMiBAQAogICAgIHsKICAgICAgICAgcmVjdC5sZWZ0ICs9IHRlbXBsYXRlLnggKiB4VW5pdCAvIDQ7CiAgICAgICAgIHJlY3QudG9wICs9IHRlbXBsYXRlLnkgKiB5VW5pdCAvIDg7Ci0gICAgICAgIGlmICggISh0ZW1wbGF0ZS5zdHlsZSAmIERTX0FCU0FMSUdOKSAmJiAhKHRlbXBsYXRlLnN0eWxlICYgV1NfQ0hJTEQpICkKLSAgICAgICAgICAgIENsaWVudFRvU2NyZWVuMTYoIG93bmVyLCAoUE9JTlQxNiAqKSZyZWN0ICk7CisgICAgICAgIGlmICggISh0ZW1wbGF0ZS5zdHlsZSAmIFdTX0NISUxEKSApCisJeworICAgICAgICAgICAgSU5UMTYgZFgsIGRZOworCisgICAgICAgICAgICBpZiggISh0ZW1wbGF0ZS5zdHlsZSAmIERTX0FCU0FMSUdOKSApCisgICAgICAgICAgICAgICAgQ2xpZW50VG9TY3JlZW4xNiggb3duZXIsIChQT0lOVDE2ICopJnJlY3QgKTsKKwkgICAgCisgICAgICAgICAgICAvKiB0cnkgdG8gZml0IGl0IGludG8gdGhlIGRlc2t0b3AgKi8KKworICAgICAgICAgICAgaWYoIChkWCA9IHJlY3QubGVmdCArIHJlY3QucmlnaHQgKyBTWVNNRVRSSUNTX0NYRExHRlJBTUUgCisgICAgICAgICAgICAgICAgIC0gU1lTTUVUUklDU19DWFNDUkVFTikgPiAwICkgcmVjdC5sZWZ0IC09IGRYOworICAgICAgICAgICAgaWYoIChkWSA9IHJlY3QudG9wICsgcmVjdC5ib3R0b20gKyBTWVNNRVRSSUNTX0NZRExHRlJBTUUKKyAgICAgICAgICAgICAgICAgLSBTWVNNRVRSSUNTX0NZU0NSRUVOKSA+IDAgKSByZWN0LnRvcCAtPSBkWTsKKyAgICAgICAgICAgIGlmKCByZWN0LmxlZnQgPCAwICkgcmVjdC5sZWZ0ID0gMDsKKyAgICAgICAgICAgIGlmKCByZWN0LnRvcCA8IDAgKSByZWN0LnRvcCA9IDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocHJvY1R5cGUgIT0gV0lOX1BST0NfMTYpCkBAIC01NjksNiArNTg2LDkgQEAKICAgICBkbGdJbmZvLT5tc2dSZXN1bHQgPSAwOyAgLyogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRoZSBkZWZhdWx0IGJ1dHRvbiBpZCAqLwogICAgIGRsZ0luZm8tPmhEaWFsb2dIZWFwID0gMDsKIAorICAgIGlmIChkbGdJbmZvLT5oVXNlckZvbnQpCisgICAgICAgIFNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9TRVRGT05ULCAoV1BBUkFNMzIpZGxnSW5mby0+aFVzZXJGb250LCAwICk7CisKICAgICAvKiBDcmVhdGUgY29udHJvbHMgKi8KIAogICAgIGlmICghRElBTE9HX0NyZWF0ZUNvbnRyb2xzKCB3bmRQdHIsIGRsZ1RlbXBsYXRlLCB0ZW1wbGF0ZS5uYkl0ZW1zLApAQCAtNTgxLDggKzYwMSw2IEBACiAgICAgLyogU2VuZCBpbml0aWFsaXNhdGlvbiBtZXNzYWdlcyBhbmQgc2V0IGZvY3VzICovCiAKICAgICBkbGdJbmZvLT5od25kRm9jdXMgPSBHZXROZXh0RGxnVGFiSXRlbTMyKCBod25kLCAwLCBGQUxTRSApOwotICAgIGlmIChkbGdJbmZvLT5oVXNlckZvbnQpCi0JU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX1NFVEZPTlQsIChXUEFSQU0zMilkbGdJbmZvLT5oVXNlckZvbnQsIDAgKTsKICAgICBpZiAoU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX0lOSVRESUFMT0csCiAgICAgICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQogCVNldEZvY3VzMzIoIGRsZ0luZm8tPmh3bmRGb2N1cyApOwpAQCAtMTM5MSw2ICsxNDA5LDk2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBESUFMT0dfRGxnRGlyTGlzdAorICoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgRGxnRGlyTGlzdCoKKyAqLworc3RhdGljIElOVDMyIERJQUxPR19EbGdEaXJMaXN0KCBIV05EMzIgaERsZywgTFBDU1RSIHNwZWMsIElOVDMyIGlkTEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaWRTdGF0aWMsIFVJTlQzMiBhdHRyaWIsIEJPT0wzMiBjb21ibyApCit7CisgICAgaW50IGRyaXZlOworICAgIEhXTkQzMiBod25kOworCisjZGVmaW5lIFNFTkRNU0cobXNnLHdwYXJhbSxscGFyYW0pIFwKKyAgICAoKGF0dHJpYiAmIERETF9QT1NUTVNHUykgPyBQb3N0TWVzc2FnZSggaHduZCwgbXNnLCB3cGFyYW0sIGxwYXJhbSApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZW5kTWVzc2FnZTMyQSggaHduZCwgbXNnLCB3cGFyYW0sIGxwYXJhbSApKQorCisgICAgZHByaW50Zl9kaWFsb2coIHN0ZGRlYiwgIkRsZ0Rpckxpc3Q6ICUwNHggJyVzJyAlZCAlZCAlMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICBoRGxnLCBzcGVjID8gc3BlYyA6ICJOVUxMIiwgaWRMQm94LCBpZFN0YXRpYywgYXR0cmliICk7CisKKyAgICBpZiAoc3BlYyAmJiBzcGVjWzBdICYmIChzcGVjWzFdID09ICc6JykpCisgICAgeworICAgICAgICBkcml2ZSA9IHRvdXBwZXIoIHNwZWNbMF0gKSAtICdBJzsKKyAgICAgICAgc3BlYyArPSAyOworICAgICAgICBpZiAoIURSSVZFX1NldEN1cnJlbnREcml2ZSggZHJpdmUgKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlIGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CisKKyAgICBpZiAoaWRMQm94ICYmICgoaHduZCA9IEdldERsZ0l0ZW0oIGhEbGcsIGlkTEJveCApKSAhPSAwKSkKKyAgICB7CisgICAgICAgIC8qIElmIHRoZSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnksIGNoZGlyIHRvIGl0ICovCisgICAgICAgIGlmICghc3BlYyB8fCAhc3BlY1swXSB8fCBEUklWRV9DaGRpciggZHJpdmUsIHNwZWMgKSkgc3BlYyA9ICIqLioiOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsICpwMjsKKyAgICAgICAgICAgIHAgPSBzcGVjOworICAgICAgICAgICAgaWYgKChwMiA9IHN0cnJjaHIoIHAsICdcXCcgKSkpIHAgPSBwMiArIDE7CisgICAgICAgICAgICBpZiAoKHAyID0gc3RycmNociggcCwgJy8nICkpKSBwID0gcDIgKyAxOworICAgICAgICAgICAgaWYgKHAgIT0gc3BlYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCT09MMzIgcmV0ID0gRkFMU0U7CisgICAgICAgICAgICAgICAgY2hhciAqZGlyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLCBwIC0gc3BlYyApOworICAgICAgICAgICAgICAgIGlmIChkaXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsc3RyY3B5bjMyQSggZGlyLCBzcGVjLCBwIC0gc3BlYyApOworICAgICAgICAgICAgICAgICAgICByZXQgPSBEUklWRV9DaGRpciggZHJpdmUsIGRpciApOworICAgICAgICAgICAgICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgZGlyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghcmV0KSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgc3BlYyA9IHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGRwcmludGZfZGlhbG9nKCBzdGRkZWIsICJMaXN0Qm94RGlyZWN0b3J5OiBwYXRoPSVjOlxcJXMgbWFzaz0lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICdBJyArIGRyaXZlLCBEUklWRV9HZXREb3NDd2QoZHJpdmUpLCBzcGVjICk7CisgICAgICAgIAorICAgICAgICBTRU5ETVNHKCBjb21ibyA/IENCX1JFU0VUQ09OVEVOVDMyIDogTEJfUkVTRVRDT05URU5UMzIsIDAsIDAgKTsKKyAgICAgICAgaWYgKChhdHRyaWIgJiBERExfRElSRUNUT1JZKSAmJiAhKGF0dHJpYiAmIERETF9FWENMVVNJVkUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU0VORE1TRyggY29tYm8gPyBDQl9ESVIzMiA6IExCX0RJUjMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYiAmIH4oRERMX0RJUkVDVE9SWSB8IERETF9EUklWRVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pc3BlYyApID09IExCX0VSUikKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoU0VORE1TRyggY29tYm8gPyBDQl9ESVIzMiA6IExCX0RJUjMyLAorICAgICAgICAgICAgICAgICAgICAgICAoYXR0cmliICYgKERETF9ESVJFQ1RPUlkgfCBERExfRFJJVkVTKSkgfCBERExfRVhDTFVTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pIiouKiIgKSA9PSBMQl9FUlIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFNFTkRNU0coIGNvbWJvID8gQ0JfRElSMzIgOiBMQl9ESVIzMiwgYXR0cmliLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pc3BlYyApID09IExCX0VSUikKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWRTdGF0aWMgJiYgKChod25kID0gR2V0RGxnSXRlbSggaERsZywgaWRTdGF0aWMgKSkgIT0gMCkpCisgICAgeworICAgICAgICBjaGFyIHRlbXBbNTEyXTsKKyAgICAgICAgaW50IGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CisgICAgICAgIHN0cmNweSggdGVtcCwgIkE6XFwiICk7CisgICAgICAgIHRlbXBbMF0gKz0gZHJpdmU7CisgICAgICAgIGxzdHJjcHluMzJBKCB0ZW1wICsgMywgRFJJVkVfR2V0RG9zQ3dkKGRyaXZlKSwgc2l6ZW9mKHRlbXApLTMgKTsKKyAgICAgICAgQW5zaUxvd2VyKCB0ZW1wICk7CisgICAgICAgIC8qIENhbid0IHVzZSBQb3N0TWVzc2FnZSgpIGhlcmUsIGJlY2F1c2UgdGhlIHN0cmluZyBpcyBvbiB0aGUgc3RhY2sgKi8KKyAgICAgICAgU2V0RGxnSXRlbVRleHQzMkEoIGhEbGcsIGlkU3RhdGljLCB0ZW1wICk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworI3VuZGVmIFNFTkRNU0cKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgIERsZ0RpclNlbGVjdCAgICAoVVNFUi45OSkKICAqLwogQk9PTDE2IERsZ0RpclNlbGVjdCggSFdORDE2IGh3bmQsIExQU1RSIHN0ciwgSU5UMTYgaWQgKQpAQCAtMTQ2MCwzICsxNTY4LDczIEBACiB7CiAgICAgcmV0dXJuIERJQUxPR19EbGdEaXJTZWxlY3QoIGh3bmQsIChMUFNUUilzdHIsIGxlbiwgaWQsIFRSVUUsIFRSVUUsIFRSVUUgKTsKIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIERsZ0Rpckxpc3QxNiAgICAoVVNFUi4xMDApCisgKi8KK0lOVDE2IERsZ0Rpckxpc3QxNiggSFdORDE2IGhEbGcsIExQQ1NUUiBzcGVjLCBJTlQxNiBpZExCb3gsIElOVDE2IGlkU3RhdGljLAorICAgICAgICAgICAgICAgICAgICBVSU5UMTYgYXR0cmliICkKK3sKKyAgICByZXR1cm4gRElBTE9HX0RsZ0Rpckxpc3QoIGhEbGcsIHNwZWMsIGlkTEJveCwgaWRTdGF0aWMsIGF0dHJpYiwgRkFMU0UgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgIERsZ0Rpckxpc3QzMkEgICAgKFVTRVIzMi4xNDIpCisgKi8KK0lOVDMyIERsZ0Rpckxpc3QzMkEoIEhXTkQzMiBoRGxnLCBMUENTVFIgc3BlYywgSU5UMzIgaWRMQm94LCBJTlQzMiBpZFN0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBhdHRyaWIgKQoreworICAgIHJldHVybiBESUFMT0dfRGxnRGlyTGlzdCggaERsZywgc3BlYywgaWRMQm94LCBpZFN0YXRpYywgYXR0cmliLCBGQUxTRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRGxnRGlyTGlzdDMyVyAgICAoVVNFUjMyLjE0NSkKKyAqLworSU5UMzIgRGxnRGlyTGlzdDMyVyggSFdORDMyIGhEbGcsIExQQ1dTVFIgc3BlYywgSU5UMzIgaWRMQm94LCBJTlQzMiBpZFN0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBhdHRyaWIgKQoreworICAgIElOVDMyIHJldDsKKyAgICBMUFNUUiBzcGVjQSA9IE5VTEw7CisgICAgaWYgKHNwZWMpIHNwZWNBID0gU1RSSU5HMzJfRHVwVW5pVG9BbnNpKHNwZWMpOworICAgIHJldCA9IERJQUxPR19EbGdEaXJMaXN0KCBoRGxnLCBzcGVjQSwgaWRMQm94LCBpZFN0YXRpYywgYXR0cmliLCBGQUxTRSApOworICAgIGlmIChzcGVjQSkgZnJlZSggc3BlY0EgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRGxnRGlyTGlzdENvbWJvQm94MTYgICAgKFVTRVIuMTk1KQorICovCitJTlQxNiBEbGdEaXJMaXN0Q29tYm9Cb3gxNiggSFdORDE2IGhEbGcsIExQQ1NUUiBzcGVjLCBJTlQxNiBpZENCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgaWRTdGF0aWMsIFVJTlQxNiBhdHRyaWIgKQoreworICAgIHJldHVybiBESUFMT0dfRGxnRGlyTGlzdCggaERsZywgc3BlYywgaWRDQm94LCBpZFN0YXRpYywgYXR0cmliLCBUUlVFICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBEbGdEaXJMaXN0Q29tYm9Cb3gzMkEgICAgKFVTRVIzMi4xNDMpCisgKi8KK0lOVDMyIERsZ0Rpckxpc3RDb21ib0JveDMyQSggSFdORDMyIGhEbGcsIExQQ1NUUiBzcGVjLCBJTlQzMiBpZENCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGlkU3RhdGljLCBVSU5UMzIgYXR0cmliICkKK3sKKyAgICByZXR1cm4gRElBTE9HX0RsZ0Rpckxpc3QoIGhEbGcsIHNwZWMsIGlkQ0JveCwgaWRTdGF0aWMsIGF0dHJpYiwgVFJVRSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgICAgRGxnRGlyTGlzdENvbWJvQm94MzJXICAgIChVU0VSMzIuMTQ0KQorICovCitJTlQzMiBEbGdEaXJMaXN0Q29tYm9Cb3gzMlcoIEhXTkQzMiBoRGxnLCBMUENXU1RSIHNwZWMsIElOVDMyIGlkQ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgaWRTdGF0aWMsIFVJTlQzMiBhdHRyaWIgKQoreworICAgIElOVDMyIHJldDsKKyAgICBMUFNUUiBzcGVjQSA9IE5VTEw7CisgICAgaWYgKHNwZWMpIHNwZWNBID0gU1RSSU5HMzJfRHVwVW5pVG9BbnNpKHNwZWMpOworICAgIHJldCA9IERJQUxPR19EbGdEaXJMaXN0KCBoRGxnLCBzcGVjQSwgaWRDQm94LCBpZFN0YXRpYywgYXR0cmliLCBGQUxTRSApOworICAgIGlmIChzcGVjQSkgZnJlZSggc3BlY0EgKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ldmVudC5jIGIvd2luZG93cy9ldmVudC5jCmluZGV4IDIwMTAwNTIuLjQ5ZDMyNWEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZXZlbnQuYworKysgYi93aW5kb3dzL2V2ZW50LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKKyNpbmNsdWRlICJrZXlib2FyZC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJkZGVfcHJvYy5oIgpAQCAtNjIsMTMgKzYzLDkgQEAKICAgLyogU3RhdGUgdmFyaWFibGVzICovCiBCT09MIE1vdXNlQnV0dG9uc1N0YXRlc1tOQl9CVVRUT05TXTsKIEJPT0wgQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbTkJfQlVUVE9OU107Ci1CWVRFIEtleVN0YXRlVGFibGVbMjU2XTsKLUJZVEUgQXN5bmNLZXlTdGF0ZVRhYmxlWzI1Nl07CitCWVRFIElucHV0S2V5U3RhdGVUYWJsZVsyNTZdOwogCiAKLVdQQVJBTTE2IGxhc3RFdmVudENoYXIgPSAwOyAvKiB0aGlzIHdpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkIG9uY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUb0FzY2lpIHN0YXJ0cyB3b3JraW5nICovCi0KIHN0YXRpYyBIV05EMzIgY2FwdHVyZVduZCA9IDA7CiBzdGF0aWMgQk9PTDMyIElucHV0RW5hYmxlZCA9IFRSVUU7CiAKQEAgLTEyOCw4ICsxMjUsOCBAQAogCXVuc2lnbmVkIGxvbmcgY291bnQgOiAxNjsKIAl1bnNpZ25lZCBsb25nIGNvZGUgOiA4OwogCXVuc2lnbmVkIGxvbmcgZXh0ZW5kZWQgOiAxOwotCXVuc2lnbmVkIGxvbmcgOiAyOwotCXVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQgOiAyOworCXVuc2lnbmVkIGxvbmcgdW51c2VkIDogMjsKKwl1bnNpZ25lZCBsb25nIHdpbl9pbnRlcm5hbCA6IDI7CiAJdW5zaWduZWQgbG9uZyBjb250ZXh0IDogMTsKIAl1bnNpZ25lZCBsb25nIHByZXZpb3VzIDogMTsKIAl1bnNpZ25lZCBsb25nIHRyYW5zaXRpb24gOiAxOwpAQCAtMTg4LDcgKzE4NSw3IEBACiB7CiAgICAgV05EICpwV25kOwogICAgIAotICAgIGlmIChYRmluZENvbnRleHQoIGRpc3BsYXksICgoWEFueUV2ZW50ICopZXZlbnQpLT53aW5kb3csIHdpbkNvbnRleHQsCisgICAgaWYgKFhGaW5kQ29udGV4dCggZGlzcGxheSwgZXZlbnQtPnhhbnkud2luZG93LCB3aW5Db250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwV25kICkgIT0gMCkKICAgICAgICAgcmV0dXJuOyAgLyogTm90IGZvciBhIHJlZ2lzdGVyZWQgd2luZG93ICovCiAKQEAgLTUyMSw4ICs1MTgsMTYgQEAKICAgICBpbnQgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIDEsICZrZXlzeW0sICZjcyk7CiAKICAgICBTdHJbYXNjaWlfY2hhcnNdID0gJ1wwJzsKLSAgICBkcHJpbnRmX2tleShzdGRkZWIsIldNX0tFWT8/PyA6IGtleXN5bT0lbFgsIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLCAKLQkgICBrZXlzeW0sIGFzY2lpX2NoYXJzLCBTdHJbMF0sIFN0cik7CisgICAgaWYgKGRlYnVnZ2luZ19rZXkpCisJeworCWNoYXIJKmtzbmFtZTsKKworCWtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOworCWlmICgha3NuYW1lKQorCSAgICBrc25hbWUgPSAiTm8gTmFtZSI7CisJZnByaW50ZihzdGRkZWIsICJXTV9LRVk/Pz8gOiBrZXlzeW09JWxYICglcyksIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLCAKKwkgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIFN0clswXSwgU3RyKTsKKwl9CiAKICAgICAvKiBDdHJsLUFsdC1SZXR1cm4gZW50ZXJzIHRoZSBkZWJ1Z2dlciAqLwogICAgIGlmICgoa2V5c3ltID09IFhLX1JldHVybikgJiYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSAmJgpAQCAtNTU2LDYgKzU2MSwyNyBAQAogCSAgICB2a2V5ID0gbW9kaWZpZXJfa2V5W2tleSAtIDB4RTFdOwogCWVsc2UgaWYgKGtleSA9PSAweEZGKSAgICAgICAgICAgICAgICAgICAgICAvKiBERUwga2V5ICovCiAJICAgIHZrZXkgPSBWS19ERUxFVEU7CisJLyogZXh0ZW5kZWQgbXVzdCBhbHNvIGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKKwlJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCisJa2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KKwlzd2l0Y2ggKGtleXN5bSkKKwkgICAgeworCSAgICBjYXNlIFhLX0NvbnRyb2xfUiA6CisJICAgIGNhc2UgWEtfQWx0X1IgOgorCSAgICBjYXNlIFhLX0luc2VydCA6CisJICAgIGNhc2UgWEtfRGVsZXRlIDoKKwkgICAgY2FzZSBYS19Ib21lIDoKKwkgICAgY2FzZSBYS19FbmQgOgorCSAgICBjYXNlIFhLX1BhZ2VfVXAgOgorCSAgICBjYXNlIFhLX1BhZ2VfRG93biA6CisJICAgIGNhc2UgWEtfTGVmdCA6CisJICAgIGNhc2UgWEtfVXAgOgorCSAgICBjYXNlIFhLX1JpZ2h0IDoKKwkgICAgY2FzZSBYS19Eb3duIDoKKwkgICAgY2FzZSBYS19LUF9EaXZpZGUgOgorCSAgICBjYXNlIFhLX0tQX0VudGVyIDoKKwkJZXh0ZW5kZWQgPSAxOworCSAgICB9CiAgICAgfQogICAgIGVsc2UgaWYgKGtleV90eXBlID09IDApICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhcmFjdGVyIGtleSAqLwogICAgIHsKQEAgLTU2OCwyNCArNTk0LDcgQEAKIAkgIHsKICNkZWZpbmUgdmtjYXNlKGssdmFsKSBjYXNlIGs6IHZrZXkgPSB2YWw7IGJyZWFrOwogI2RlZmluZSB2a2Nhc2UyKGsxLGsyLHZhbCkgY2FzZSBrMTogY2FzZSBrMjogdmtleSA9IHZhbDsgYnJlYWs7Ci0KLQkgICAgICAvKiBJIHdpc2ggSSBoYWQgYSBiaXQtcGFpcmVkIGtleWJvYXJkISAqLwotCSAgICAgIHZrY2FzZSgnIScsJzEnKTsgdmtjYXNlKCdAJywnMicpOyB2a2Nhc2UoJyMnLCczJyk7Ci0JICAgICAgdmtjYXNlKCckJywnNCcpOyB2a2Nhc2UoJyUnLCc1Jyk7IHZrY2FzZSgnXicsJzYnKTsKLQkgICAgICB2a2Nhc2UoJyYnLCc3Jyk7IHZrY2FzZSgnKicsJzgnKTsgdmtjYXNlKCcoJywnOScpOwotCSAgICAgIHZrY2FzZSgnKScsJzAnKTsKLQotCSAgICAgIHZrY2FzZTIoJ2AnLCd+JywweGMwKTsKLQkgICAgICB2a2Nhc2UyKCctJywnXycsMHhiZCk7Ci0JICAgICAgdmtjYXNlMignPScsJysnLDB4YmIpOwotCSAgICAgIHZrY2FzZTIoJ1snLCd7JywweGRiKTsKLQkgICAgICB2a2Nhc2UyKCddJywnfScsMHhkZCk7Ci0JICAgICAgdmtjYXNlMignOycsJzonLDB4YmEpOwotCSAgICAgIHZrY2FzZTIoJ1wnJywnXCInLDB4ZGUpOwotCSAgICAgIHZrY2FzZTIoJywnLCc8JywweGJjKTsKLQkgICAgICB2a2Nhc2UyKCcuJywnPicsMHhiZSk7Ci0JICAgICAgdmtjYXNlMignLycsJz8nLDB4YmYpOwotCSAgICAgIHZrY2FzZTIoJ1xcJywnfCcsMHhkYyk7CisJICAgIFdJTkVfVktFWV9NQVBQSU5HUwogI3VuZGVmIHZrY2FzZQogI3VuZGVmIHZrY2FzZTIKIAkgICAgZGVmYXVsdDoKQEAgLTU5Niw1MCArNjA1LDQxIEBACiAKICAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgewotICAgICAgICBpZiAoIShLZXlTdGF0ZVRhYmxlW3ZrZXldICYgMHg4MCkpCi0gICAgICAgICAgICBLZXlTdGF0ZVRhYmxlW3ZrZXldIF49IDB4MDE7Ci0JS2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDgwOworICAgICAgICBpZiAoIShJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJiAweDgwKSkKKyAgICAgICAgICAgIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSBePSAweDAxOworCUlucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSB8PSAweDgwOwogCWtleWxwLmxwMS5jb3VudCA9IDE7CiAJa2V5bHAubHAxLmNvZGUgPSBMT0JZVEUoZXZlbnQtPmtleWNvZGUpIC0gODsKIAlrZXlscC5scDEuZXh0ZW5kZWQgPSAoZXh0ZW5kZWQgPyAxIDogMCk7Ci0Ja2V5bHAubHAxLnJlc2VydmVkID0gKGFzY2lpX2NoYXJzID8gMSA6IDApOworCWtleWxwLmxwMS53aW5faW50ZXJuYWwgPSAwOwogCWtleWxwLmxwMS5jb250ZXh0ID0gKCAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2spIHx8IAotCQkJICAgICAgIChLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkpID8gMSA6IDA7CisJCQkgICAgICAgKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApKSA/IDEgOiAwOwogCWtleWxwLmxwMS5wcmV2aW91cyA9IChLZXlEb3duID8gMCA6IDEpOwogCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMDsKIAlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIHdQYXJhbT0lWCwgbFBhcmFtPSVsWFxuIiwgCiAJCSAgICB2a2V5LCBrZXlscC5scDIgKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIEtleVN0YXRlPSVYXG4iLCBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKLQloYXJkd2FyZV9ldmVudCggS2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODAgPyBXTV9TWVNLRVlET1dOIDogV01fS0VZRE9XTiwgCisJZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLCBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOworCWhhcmR3YXJlX2V2ZW50KCBJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV04sIAogCQkgICAgICAgIHZrZXksIGtleWxwLmxwMiwKIAkJICAgICAgICBldmVudC0+eF9yb290IC0gZGVza3RvcFgsIGV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwKIAkJICAgICAgICBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCApOwogCUtleURvd24gPSBUUlVFOwotCi0JLyogQ3VycmVudGx5IHdlIHVzZSByZXNlcnZlZCBmaWVsZCBpbiB0aGUgc2Nhbi1jb2RlIGJ5dGUgdG8KLQkgKiBtYWtlIGl0IHBvc3NpYmxlIGZvciBUcmFuc2xhdGVNZXNzYWdlIHRvIHJlY29nbml6ZSBjaGFyYWN0ZXIga2V5cwotCSAqIGFuZCBnZXQgdGhlbSBmcm9tIGxhc3RFdmVudENoYXIgZ2xvYmFsIHZhcmlhYmxlLgotCSAqCi0JICogVG9Bc2NpaSBzaG91bGQgaGFuZGxlIGl0LgotCSAqLwotCi0JaWYoIGFzY2lpX2NoYXJzICkgbGFzdEV2ZW50Q2hhciA9IFN0clswXTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlVSU5UIHN5c0tleSA9IEtleVN0YXRlVGFibGVbVktfTUVOVV07CisJVUlOVCBzeXNLZXkgPSBJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV07CiAKLQlLZXlTdGF0ZVRhYmxlW3ZrZXldICY9IH4weDgwOyAKKwlJbnB1dEtleVN0YXRlVGFibGVbdmtleV0gJj0gfjB4ODA7IAogCWtleWxwLmxwMS5jb3VudCA9IDE7CiAJa2V5bHAubHAxLmNvZGUgPSBMT0JZVEUoZXZlbnQtPmtleWNvZGUpIC0gODsKIAlrZXlscC5scDEuZXh0ZW5kZWQgPSAoZXh0ZW5kZWQgPyAxIDogMCk7Ci0Ja2V5bHAubHAxLnJlc2VydmVkID0gMDsKKwlrZXlscC5scDEud2luX2ludGVybmFsID0gMDsKIAlrZXlscC5scDEuY29udGV4dCA9IChldmVudC0+c3RhdGUgJiBNb2QxTWFzayA/IDEgOiAwKTsKIAlrZXlscC5scDEucHJldmlvdXMgPSAxOwogCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKIAlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIHdQYXJhbT0lWCwgbFBhcmFtPSVsWFxuIiwgCiAJCSAgICB2a2V5LCBrZXlscC5scDIgKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIEtleVN0YXRlPSVYXG4iLCBLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKKwlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIElucHV0S2V5U3RhdGU9JVhcbiIsIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7CiAJaGFyZHdhcmVfZXZlbnQoIHN5c0tleSAmIDB4ODAgPyBXTV9TWVNLRVlVUCA6IFdNX0tFWVVQLCAKIAkJICAgICAgICB2a2V5LCBrZXlscC5scDIsCiAJCSAgICAgICAgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLCBldmVudC0+eV9yb290IC0gZGVza3RvcFksCmRpZmYgLS1naXQgYS93aW5kb3dzL2dyYXBoaWNzLmMgYi93aW5kb3dzL2dyYXBoaWNzLmMKaW5kZXggNDBkMWMzMC4uNTAwM2YxNyAxMDA2NDQKLS0tIGEvd2luZG93cy9ncmFwaGljcy5jCisrKyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwpAQCAtODM0LDcgKzgzNCw3IEBACiB7CiAgICAgUkVDVDMyIHJlY3QzMjsKICAgICBDT05WX1JFQ1QxNlRPMzIoIHJjLCAmcmVjdDMyICk7Ci0gICAgcmV0dXJuIERyYXdGb2N1c1JlY3QzMiggaGRjLCAmcmVjdDMyICk7CisgICAgRHJhd0ZvY3VzUmVjdDMyKCBoZGMsICZyZWN0MzIgKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGRjYzVmZGYuLmVmODFkM2EgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC0xMzMsNyArMTMzLDYgQEAKICAgICBkYXRhLT5vd25lclF1ZXVlICA9IGhRdWV1ZTsKICAgICBkYXRhLT5vd25lck1vZHVsZSA9IGhJbnN0OwogICAgIGRhdGEtPmluSG9va1Byb2MgID0gMDsKLSAgICBkcHJpbnRmX2hvb2soIHN0ZGRlYiwgIlNldHRpbmcgaG9vayAlZDogcmV0PSUwNHhcbiIsIGlkLCBoYW5kbGUgKTsKIAogICAgIC8qIEluc2VydCBpdCBpbiB0aGUgY29ycmVjdCBsaW5rZWQgbGlzdCAqLwogCkBAIC0xNDgsNiArMTQ3LDggQEAKICAgICAgICAgZGF0YS0+bmV4dCA9IEhPT0tfc3lzdGVtSG9va3NbaWQgLSBXSF9NSU5IT09LXTsKICAgICAgICAgSE9PS19zeXN0ZW1Ib29rc1tpZCAtIFdIX01JTkhPT0tdID0gaGFuZGxlOwogICAgIH0KKyAgICBkcHJpbnRmX2hvb2soIHN0ZGRlYiwgIlNldHRpbmcgaG9vayAlZDogcmV0PSUwNHggW25leHQ9JTA0eF1cbiIsIAorCQkJICAgaWQsIGhhbmRsZSwgZGF0YS0+bmV4dCApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTE4OCw3ICsxODksNyBAQAogICAgIHdoaWxlICgqcHJldkhvb2sgJiYgKnByZXZIb29rICE9IGhvb2spCiAgICAgICAgIHByZXZIb29rID0gJigoSE9PS0RBVEEgKilVU0VSX0hFQVBfTElOX0FERFIoKnByZXZIb29rKSktPm5leHQ7CiAKLSAgICAgaWYgKCEqcHJldkhvb2spIHJldHVybiBGQUxTRTsKKyAgICBpZiAoISpwcmV2SG9vaykgcmV0dXJuIEZBTFNFOwogICAgICpwcmV2SG9vayA9IGRhdGEtPm5leHQ7CiAgICAgVVNFUl9IRUFQX0ZSRUUoIGhvb2sgKTsKICAgICByZXR1cm4gVFJVRTsKQEAgLTI1MSw2ICsyNTIsMzMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBIT09LX1Jlc2V0UXVldWVIb29rcworICovCit2b2lkIEhPT0tfUmVzZXRRdWV1ZUhvb2tzKCBIUVVFVUUxNiBoUXVldWUgKQoreworICAgIE1FU1NBR0VRVUVVRSAqcXVldWU7CisKKyAgICBpZiAoKHF1ZXVlID0gKE1FU1NBR0VRVUVVRSAqKUdsb2JhbExvY2sxNiggaFF1ZXVlICkpICE9IE5VTEwpCisgICAgeworCUhPT0tEQVRBKglkYXRhOworCUhIT09LCQlob29rOworCWludAkJaWQ7CisJZm9yKCBpZCA9IFdIX01JTkhPT0s7IGlkIDw9IFdIX01BWEhPT0s7IGlkKysgKQorCXsKKwkgICAgaG9vayA9IHF1ZXVlLT5ob29rc1tpZCAtIFdIX01JTkhPT0tdOworCSAgICB3aGlsZSggaG9vayApCisJICAgIHsKKwkgICAgICAgIGlmKCAoZGF0YSA9IChIT09LREFUQSAqKVVTRVJfSEVBUF9MSU5fQUREUihob29rKSkgKQorCSAgICAgICAgeworCQkgIGRhdGEtPm93bmVyUXVldWUgPSBoUXVldWU7CisJCSAgaG9vayA9IGRhdGEtPm5leHQ7CisJCX0gZWxzZSBicmVhazsKKwkgICAgfQorCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBIT09LX0ZyZWVNb2R1bGVIb29rcwogICovCiB2b2lkIEhPT0tfRnJlZU1vZHVsZUhvb2tzKCBITU9EVUxFMTYgaE1vZHVsZSApCmRpZmYgLS1naXQgYS93aW5kb3dzL2tleWJvYXJkLmMgYi93aW5kb3dzL2tleWJvYXJkLmMKaW5kZXggY2NjODE1Yi4uMTBlM2VkMCAxMDA2NDQKLS0tIGEvd2luZG93cy9rZXlib2FyZC5jCisrKyBiL3dpbmRvd3Mva2V5Ym9hcmQuYwpAQCAtMyw0NyArMyw2MCBAQAogICoKICAqIENvcHlyaWdodCAxOTkzIEJvYiBBbXN0YWR0CiAgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiBleHRlcm4gQk9PTCBNb3VzZUJ1dHRvbnNTdGF0ZXNbM107CiBleHRlcm4gQk9PTCBBc3luY01vdXNlQnV0dG9uc1N0YXRlc1szXTsKLWV4dGVybiBCWVRFIEtleVN0YXRlVGFibGVbMjU2XTsKLWV4dGVybiBCWVRFIEFzeW5jS2V5U3RhdGVUYWJsZVsyNTZdOworZXh0ZXJuIEJZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CitCWVRFIEFzeW5jS2V5U3RhdGVUYWJsZVsyNTZdOworCitleHRlcm4gQllURSBRdWV1ZUtleVN0YXRlVGFibGVbMjU2XTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQlHZXRLZXlTdGF0ZQkJCVtVU0VSLjEwNl0KKyAqIEFuIGFwcGxpY2F0aW9uIGNhbGxzIHRoZSBHZXRLZXlTdGF0ZSBmdW5jdGlvbiBpbiByZXNwb25zZSB0byBhCisgKiBrZXlib2FyZC1pbnB1dCBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXkKKyAqIGF0IHRoZSB0aW1lIHRoZSBpbnB1dCBtZXNzYWdlIHdhcyBnZW5lcmF0ZWQuICAoU0RLIDMuMSBWb2wgMi4gcCAzOTApCiAgKi8KIElOVCBHZXRLZXlTdGF0ZShJTlQga2V5Y29kZSkKIHsKICAgICBJTlQgcmV0dmFsOwogCisgICAgaWYgKGtleWNvZGUgPj0gJ2EnICYmIGtleWNvZGUgPD0gJ3onKQorICAgICAgICBrZXljb2RlICs9ICdBJyAtICdhJzsKICAgICBzd2l0Y2goa2V5Y29kZSkgewogICAgICBjYXNlIFZLX0xCVVRUT046Ci0JcmV0dXJuIE1vdXNlQnV0dG9uc1N0YXRlc1swXTsKKwlyZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF07CiAgICAgIGNhc2UgVktfTUJVVFRPTjoKLQlyZXR1cm4gTW91c2VCdXR0b25zU3RhdGVzWzFdOworCXJldHZhbCA9IE1vdXNlQnV0dG9uc1N0YXRlc1sxXTsKICAgICAgY2FzZSBWS19SQlVUVE9OOgotCXJldHVybiBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl07CisJcmV0dmFsID0gTW91c2VCdXR0b25zU3RhdGVzWzJdOwogICAgICBkZWZhdWx0OgotCXJldHZhbCA9ICggKElOVCkoS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4ODApIDw8IDggKSB8Ci0JCSAgIChJTlQpKEtleVN0YXRlVGFibGVba2V5Y29kZV0gJiAweDAxKTsKKwlyZXR2YWwgPSAoIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4ODApIDw8IDggKSB8CisJCSAgIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4MDEpOwogICAgIH0KIAorICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIkdldEtleVN0YXRlKCV4KSAtPiAleFxuIiwga2V5Y29kZSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUdldEtleWJvYXJkU3RhdGUJCQlbVVNFUi4yMjJdCisgKiBBbiBhcHBsaWNhdGlvbiBjYWxscyB0aGUgR2V0S2V5Ym9hcmRTdGF0ZSBmdW5jdGlvbiBpbiByZXNwb25zZSB0byBhCisgKiBrZXlib2FyZC1pbnB1dCBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHN0YXRlIG9mIHRoZSBrZXlib2FyZAorICogYXQgdGhlIHRpbWUgdGhlIGlucHV0IG1lc3NhZ2Ugd2FzIGdlbmVyYXRlZC4gIChTREsgMy4xIFZvbCAyLiBwIDM4NykKICAqLwogdm9pZCBHZXRLZXlib2FyZFN0YXRlKEJZVEUgKmxwS2V5U3RhdGUpCiB7CiAgICAgaWYgKGxwS2V5U3RhdGUgIT0gTlVMTCkgewotCUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPj4gODsKLQlLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzFdID4+IDg7Ci0JS2V5U3RhdGVUYWJsZVtWS19SQlVUVE9OXSA9IE1vdXNlQnV0dG9uc1N0YXRlc1syXSA+PiA4OwotCW1lbWNweShscEtleVN0YXRlLCBLZXlTdGF0ZVRhYmxlLCAyNTYpOworCVF1ZXVlS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXSA9IE1vdXNlQnV0dG9uc1N0YXRlc1swXSA+PiA4OworCVF1ZXVlS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXSA9IE1vdXNlQnV0dG9uc1N0YXRlc1sxXSA+PiA4OworCVF1ZXVlS2V5U3RhdGVUYWJsZVtWS19SQlVUVE9OXSA9IE1vdXNlQnV0dG9uc1N0YXRlc1syXSA+PiA4OworCW1lbWNweShscEtleVN0YXRlLCBRdWV1ZUtleVN0YXRlVGFibGUsIDI1Nik7CiAgICAgfQogfQogCkBAIC01MywxMCArNjYsMTAgQEAKIHZvaWQgU2V0S2V5Ym9hcmRTdGF0ZShCWVRFICpscEtleVN0YXRlKQogewogICAgIGlmIChscEtleVN0YXRlICE9IE5VTEwpIHsKLQltZW1jcHkoS2V5U3RhdGVUYWJsZSwgbHBLZXlTdGF0ZSwgMjU2KTsKLQlNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPSBLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dPyAweDgwMDA6IDA7Ci0JTW91c2VCdXR0b25zU3RhdGVzWzFdID0gS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXT8gMHg4MDAwOiAwOwotCU1vdXNlQnV0dG9uc1N0YXRlc1syXSA9IEtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0/IDB4ODAwMDogMDsKKwltZW1jcHkoUXVldWVLZXlTdGF0ZVRhYmxlLCBscEtleVN0YXRlLCAyNTYpOworCU1vdXNlQnV0dG9uc1N0YXRlc1swXSA9IFF1ZXVlS2V5U3RhdGVUYWJsZVtWS19MQlVUVE9OXT8gMHg4MDAwOiAwOworCU1vdXNlQnV0dG9uc1N0YXRlc1sxXSA9IFF1ZXVlS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXT8gMHg4MDAwOiAwOworCU1vdXNlQnV0dG9uc1N0YXRlc1syXSA9IFF1ZXVlS2V5U3RhdGVUYWJsZVtWS19SQlVUVE9OXT8gMHg4MDAwOiAwOwogICAgIH0KIH0KIApAQCAtOTIsMTMgKzEwNSwxMyBAQAogCWJyZWFrOwogICAgICBkZWZhdWx0OgogCXJldHZhbCA9IEFzeW5jS2V5U3RhdGVUYWJsZVtuS2V5XSB8IAotCShLZXlTdGF0ZVRhYmxlW25LZXldID8gMHg4MDAwIDogMCk7CisJKElucHV0S2V5U3RhdGVUYWJsZVtuS2V5XSA/IDB4ODAwMCA6IDApOwogCWJyZWFrOwogICAgIH0KIAogICAgIG1lbXNldCggQXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXMsIDAsIDMgKTsgIC8qIGFsbCBzdGF0ZXMgdG8gZmFsc2UgKi8KICAgICBtZW1zZXQoIEFzeW5jS2V5U3RhdGVUYWJsZSwgMCwgMjU2ICk7CiAKKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJHZXRBc3luY0tleVN0YXRlKCV4KSAtPiAleFxuIiwgbktleSwgcmV0dmFsKTsKICAgICByZXR1cm4gcmV0dmFsOwogfQotCmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IDRhYzMyZjMuLjc3ZWUyZjkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0zMiwxNiArMzIsMTUgQEAKICNkZWZpbmUgSFdORF9CUk9BRENBU1QxNiAgKChIV05EMTYpMHhmZmZmKQogI2RlZmluZSBIV05EX0JST0FEQ0FTVDMyICAoKEhXTkQzMikweGZmZmZmZmZmKQogCi0jZGVmaW5lIEFTQ0lJX0NIQVJfSEFDSyAweDA4MDAgCi0KIHR5cGVkZWYgZW51bSB7IFNZU1FfTVNHX0FCQU5ET04sIFNZU1FfTVNHX1NLSVAsIFNZU1FfTVNHX0FDQ0VQVCB9IFNZU1FfU1RBVFVTOwogCi1leHRlcm4gV1BBUkFNMTYgbGFzdEV2ZW50Q2hhcjsJCQkJIC8qIGV2ZW50LmMgKi8KIGV4dGVybiBCT09MIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKIGV4dGVybiBCT09MIEFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzNdOwotZXh0ZXJuIEJZVEUgS2V5U3RhdGVUYWJsZVsyNTZdOworZXh0ZXJuIEJZVEUgSW5wdXRLZXlTdGF0ZVRhYmxlWzI1Nl07CiBleHRlcm4gQllURSBBc3luY0tleVN0YXRlVGFibGVbMjU2XTsKIAorQllURSBRdWV1ZUtleVN0YXRlVGFibGVbMjU2XTsKKwogZXh0ZXJuIE1FU1NBR0VRVUVVRSAqcEN1cnNvclF1ZXVlOwkJCSAvKiBxdWV1ZS5jICovCiBleHRlcm4gTUVTU0FHRVFVRVVFICpwQWN0aXZlUXVldWU7CiAKQEAgLTI5MiwyNCArMjkxLDEwIEBACiAgICAgU0VHUFRSX0ZSRUUoZXZlbnQpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICBNU0dfSm91cm5hbFBsYXlCYWNrSXNBc2NpaQotICovCi1zdGF0aWMgQk9PTCBNU0dfSm91cm5hbFBsYXlCYWNrSXNBc2NpaShXUEFSQU0xNiB3UGFyYW0pCi17Ci0gcmV0dXJuICgod1BhcmFtPlZLX0hFTFAgJiYgd1BhcmFtPFZLX0YxKSB8fCAKLSAgICAgICAgICB3UGFyYW0gPT0gVktfU1BBQ0UgIHx8Ci0gICAgICAgICAgd1BhcmFtID09IFZLX0VTQ0FQRSB8fAotICAgICAgICAgIHdQYXJhbSA9PSBWS19SRVRVUk4gfHwKLSAgICAgICAgICB3UGFyYW0gPT0gVktfVEFCICAgIHx8Ci0gICAgICAgICAgd1BhcmFtID09IFZLX0JBQ0spOyAgIAotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgTVNHX0pvdXJuYWxQbGF5QmFja01zZwogICoKLSAqIEdldCBhbiBFVkVOVE1TRyBzdHJ1Y3QgdmlhIGNhbGwgSk9VUk5BTFBBWUJBQ0sgaG9vayBmdW5jdGlvbiAKKyAqIEdldCBhbiBFVkVOVE1TRyBzdHJ1Y3QgdmlhIGNhbGwgSk9VUk5BTFBMQVlCQUNLIGhvb2sgZnVuY3Rpb24gCiAgKi8KIHN0YXRpYyBpbnQgTVNHX0pvdXJuYWxQbGF5QmFja01zZyh2b2lkKQogewpAQCAtMzMyLDI5ICszMTcsMTggQEAKICAgICAgaWYgKHRtcE1zZy0+bWVzc2FnZSA9PSBXTV9LRVlET1dOIHx8IHRtcE1zZy0+bWVzc2FnZSA9PSBXTV9TWVNLRVlET1dOKQogICAgICB7CiAgICAgICAgZm9yIChrZXlEb3duPWk9MDsgaTwyNTYgJiYgIWtleURvd247IGkrKykKLSAgICAgICAgICBpZiAoS2V5U3RhdGVUYWJsZVtpXSAmIDB4ODApCisgICAgICAgICAgaWYgKElucHV0S2V5U3RhdGVUYWJsZVtpXSAmIDB4ODApCiAgICAgICAgICAgICBrZXlEb3duKys7CiAgICAgICAgaWYgKCFrZXlEb3duKQogICAgICAgICAgbFBhcmFtIHw9IDB4NDAwMDAwMDA7ICAgICAgIAotICAgICAgIEFzeW5jS2V5U3RhdGVUYWJsZVt3UGFyYW1dPUtleVN0YXRlVGFibGVbd1BhcmFtXSB8PSAweDgwOwotICAgICAgIGlmIChNU0dfSm91cm5hbFBsYXlCYWNrSXNBc2NpaSh3UGFyYW0pKQotICAgICAgIHsKLSAgICAgICAgIGxhc3RFdmVudENoYXI9IHdQYXJhbTsgICAgICAgICAvKiBjb250cm9sIFRyYW5zbGF0ZU1lc3NhZ2UoKSAqLwotICAgICAgICAgbFBhcmFtIHw9IChMT05HKSgoTE9ORylBU0NJSV9DSEFSX0hBQ0sqMHgxMDAwMEwpOwotCi0gICAgICAgICBpZiAoIShLZXlTdGF0ZVRhYmxlW1ZLX1NISUZUXSAmIDB4ODApICYmCi0gICAgICAgICAgICAgIShLZXlTdGF0ZVRhYmxlW1ZLX0NBUElUQUxdICYgMHg4MCkpCi0gICAgICAgICAgIGxhc3RFdmVudENoYXI9IHRvbG93ZXIobGFzdEV2ZW50Q2hhcik7Ci0gICAgICAgICBpZiAoS2V5U3RhdGVUYWJsZVtWS19DT05UUk9MXSAmIDB4ODApCi0gICAgICAgICAgIGxhc3RFdmVudENoYXImPTB4MWY7Ci0gICAgICAgfSAgCisgICAgICAgQXN5bmNLZXlTdGF0ZVRhYmxlW3dQYXJhbV09SW5wdXRLZXlTdGF0ZVRhYmxlW3dQYXJhbV0gfD0gMHg4MDsKICAgICAgfSAgCiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXTV9LRVlVUCwgV01fU1lTS0VZVVAgKi8KICAgICAgewogICAgICAgIGxQYXJhbSB8PSAweEMwMDAwMDAwOyAgICAgIAotICAgICAgIEFzeW5jS2V5U3RhdGVUYWJsZVt3UGFyYW1dPUtleVN0YXRlVGFibGVbd1BhcmFtXSAmPSB+MHg4MDsKKyAgICAgICBBc3luY0tleVN0YXRlVGFibGVbd1BhcmFtXT1JbnB1dEtleVN0YXRlVGFibGVbd1BhcmFtXSAmPSB+MHg4MDsKICAgICAgfQotICAgICBpZiAoS2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApCisgICAgIGlmIChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKQogICAgICAgIGxQYXJhbSB8PSAweDIwMDAwMDAwOyAgICAgCiAgICAgIGlmICh0bXBNc2ctPnBhcmFtSCAmIDB4ODAwMCkgICAgICAgICAgICAgIC8qc3BlY2lhbF9rZXkgYml0Ki8KICAgICAgICBsUGFyYW0gfD0gMHgwMTAwMDAwMDsKQEAgLTM3Myw5ICszNDcsOSBAQAogICAgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjpNb3VzZUJ1dHRvbnNTdGF0ZXNbMl09QXN5bmNNb3VzZUJ1dHRvbnNTdGF0ZXNbMl09MTticmVhazsKICAgICAgIGNhc2UgV01fUkJVVFRPTlVQOiAgTW91c2VCdXR0b25zU3RhdGVzWzJdPUFzeW5jTW91c2VCdXR0b25zU3RhdGVzWzJdPTA7YnJlYWs7ICAgICAgCiAgICAgIH0KLSAgICAgQXN5bmNLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dPSBLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dID0gTW91c2VCdXR0b25zU3RhdGVzWzBdIDw8IDg7Ci0gICAgIEFzeW5jS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXT0gS2V5U3RhdGVUYWJsZVtWS19NQlVUVE9OXSA9IE1vdXNlQnV0dG9uc1N0YXRlc1sxXSA8PCA4OwotICAgICBBc3luY0tleVN0YXRlVGFibGVbVktfUkJVVFRPTl09IEtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl0gPDwgODsKKyAgICAgQXN5bmNLZXlTdGF0ZVRhYmxlW1ZLX0xCVVRUT05dPSBJbnB1dEtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPDwgODsKKyAgICAgQXN5bmNLZXlTdGF0ZVRhYmxlW1ZLX01CVVRUT05dPSBJbnB1dEtleVN0YXRlVGFibGVbVktfTUJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPDwgODsKKyAgICAgQXN5bmNLZXlTdGF0ZVRhYmxlW1ZLX1JCVVRUT05dPSBJbnB1dEtleVN0YXRlVGFibGVbVktfUkJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl0gPDwgODsKICAgICAgU2V0Q3Vyc29yUG9zKHRtcE1zZy0+cGFyYW1MLHRtcE1zZy0+cGFyYW1IKTsKICAgICAgbFBhcmFtPU1BS0VMT05HKHRtcE1zZy0+cGFyYW1MLHRtcE1zZy0+cGFyYW1IKTsKICAgICAgd1BhcmFtPTA7ICAgICAgICAgICAgIApAQCAtNjQ0LDcgKzYxOCw3IEBACiAKICAgICAgICAgLyogRmlyc3QgaGFuZGxlIGEgbWVzc2FnZSBwdXQgYnkgU2VuZE1lc3NhZ2UoKSAqLwogCi0JaWYgKG1zZ1F1ZXVlLT53YWtlQml0cyAmIFFTX1NFTkRNRVNTQUdFKQorCXdoaWxlIChtc2dRdWV1ZS0+d2FrZUJpdHMgJiBRU19TRU5ETUVTU0FHRSkKICAgICAgICAgICAgIFFVRVVFX1JlY2VpdmVNZXNzYWdlKCBtc2dRdWV1ZSApOwogCiAgICAgICAgIC8qIE5vdyBoYW5kbGUgYSBXTV9RVUlUIG1lc3NhZ2UgCkBAIC02NjEsNiArNjM1LDcgQEAKICAgICAgICAgICAgIG1zZy0+bWVzc2FnZSA9IFdNX1FVSVQ7CiAgICAgICAgICAgICBtc2ctPndQYXJhbSAgPSBtc2dRdWV1ZS0+d0V4aXRDb2RlOwogICAgICAgICAgICAgbXNnLT5sUGFyYW0gID0gMDsKKyAgICAgICAgICAgIGlmKCAhcGVlayApIG1zZ1F1ZXVlLT53UG9zdFFNc2cgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAKQEAgLTY5NSw3ICs2NzAsNyBAQAogCiAgICAgICAgIC8qIENoZWNrIGFnYWluIGZvciBTZW5kTWVzc2FnZSAqLwogCi0gCWlmIChtc2dRdWV1ZS0+d2FrZUJpdHMgJiBRU19TRU5ETUVTU0FHRSkKKyAJd2hpbGUgKG1zZ1F1ZXVlLT53YWtlQml0cyAmIFFTX1NFTkRNRVNTQUdFKQogICAgICAgICAgICAgUVVFVUVfUmVjZWl2ZU1lc3NhZ2UoIG1zZ1F1ZXVlICk7CiAKICAgICAgICAgLyogTm93IGZpbmQgYSBXTV9QQUlOVCBtZXNzYWdlICovCkBAIC03MzQsNyArNzA5LDcgQEAKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBQTV9OT1lJRUxEKSkKICAgICAgICAgewogICAgICAgICAgICAgVXNlcllpZWxkKCk7Ci0gICAgICAgICAgICBpZiAobXNnUXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpCisgICAgICAgICAgICB3aGlsZSAobXNnUXVldWUtPndha2VCaXRzICYgUVNfU0VORE1FU1NBR0UpCiAgICAgICAgICAgICAgICAgUVVFVUVfUmVjZWl2ZU1lc3NhZ2UoIG1zZ1F1ZXVlICk7CiAgICAgICAgIH0KIAlpZiAoKG1zZ1F1ZXVlLT53YWtlQml0cyAmIG1hc2spICYgUVNfVElNRVIpCkBAIC03NTIsNiArNzI3LDIxIEBACiAgICAgfQogCiAgICAgICAvKiBXZSBnb3QgYSBtZXNzYWdlICovCisgICAgaWYgKGZsYWdzICYgUE1fUkVNT1ZFKQorICAgIHsKKwlXT1JEIG1lc3NhZ2UgPSBtc2ctPm1lc3NhZ2U7CisKKwlpZiAobWVzc2FnZSA9PSBXTV9LRVlET1dOIHx8IG1lc3NhZ2UgPT0gV01fU1lTS0VZRE9XTikKKwl7CisJICAgIEJZVEUgKnAgPSAmUXVldWVLZXlTdGF0ZVRhYmxlW21zZy0+d1BhcmFtICYgMHhmZl07CisKKwkgICAgaWYgKCEoKnAgJiAweDgwKSkKKwkJKnAgXj0gMHgwMTsKKwkgICAgKnAgfD0gMHg4MDsKKwl9CisJZWxzZSBpZiAobWVzc2FnZSA9PSBXTV9LRVlVUCB8fCBtZXNzYWdlID09IFdNX1NZU0tFWVVQKQorCSAgICBRdWV1ZUtleVN0YXRlVGFibGVbbXNnLT53UGFyYW0gJiAweGZmXSAmPSB+MHg4MDsKKyAgICB9CiAgICAgaWYgKHBlZWspIHJldHVybiBUUlVFOwogICAgIGVsc2UgcmV0dXJuIChtc2ctPm1lc3NhZ2UgIT0gV01fUVVJVCk7CiB9CkBAIC0xMDEzLDcgKzEwMDMsNyBAQAogICAgICAgICBpZiAoV0lOUFJPQ19NYXBNc2czMkFUbzE2KCBtc2csIHdQYXJhbSwgJm1zZzE2LCAmd1BhcmFtMTYsICZsUGFyYW0gKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXQgPSBTZW5kTWVzc2FnZTE2KCBod25kLCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOwotICAgICAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnMTYsIHdQYXJhbTE2LCBsUGFyYW0gKTsKKyAgICAgICAgV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYoIG1zZywgd1BhcmFtMTYsIGxQYXJhbSApOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtMTA4OCwzMiArMTA3OCw0MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVHJhbnNsYXRlTWVzc2FnZSAgIChVU0VSLjExMykKICAqCi0gKiBUaGlzIHNob3VsZCBjYWxsIFRvQXNjaWkgYnV0IGl0IGlzIGN1cnJlbnRseSBicm9rZW4KKyAqIFRyYW5sYXRlTWVzc2FnZSB0cmFuc2xhdGUgdmlydHVhbC1rZXkgbWVzc2FnZXMgaW50byBjaGFyYWN0ZXItbWVzc2FnZXMsCisgKiBhcyBmb2xsb3dzIDoKKyAqIFdNX0tFWURPV04vV01fS0VZVVAgY29tYmluYXRpb25zIHByb2R1Y2UgYSBXTV9DSEFSIG9yIFdNX0RFQURDSEFSIG1lc3NhZ2UuCisgKiBkaXR0byByZXBsYWNpbmcgV01fKiB3aXRoIFdNX1NZUyoKKyAqIFRoaXMgcHJvZHVjZXMgV01fQ0hBUiBtZXNzYWdlcyBvbmx5IGZvciBrZXlzIG1hcHBlZCB0byBBU0NJSSBjaGFyYWN0ZXJzCisgKiBieSB0aGUga2V5Ym9hcmQgZHJpdmVyLgogICovCiAKIAogQk9PTCBUcmFuc2xhdGVNZXNzYWdlKCBMUE1TRzE2IG1zZyApCiB7CiAgICAgVUlOVCBtZXNzYWdlID0gbXNnLT5tZXNzYWdlOwotICAgIC8qIEJZVEUgd3BhcmFtWzJdOyAqLworICAgIEJZVEUgd3BhcmFtWzJdOwogICAgIAotICAgIGlmICgobWVzc2FnZSA9PSBXTV9LRVlET1dOKSB8fCAobWVzc2FnZSA9PSBXTV9LRVlVUCkgfHwKLQkobWVzc2FnZSA9PSBXTV9TWVNLRVlET1dOKSB8fCAobWVzc2FnZSA9PSBXTV9TWVNLRVlVUCkpCisgICAgaWYgKChkZWJ1Z2dpbmdfbXNnCisJJiYgbWVzc2FnZSAhPSBXTV9NT1VTRU1PVkUgJiYgbWVzc2FnZSAhPSBXTV9USU1FUikKKyAgICB8fCAoZGVidWdnaW5nX2tleQorCSYmIG1lc3NhZ2UgPj0gV01fS0VZRklSU1QgJiYgbWVzc2FnZSA8PSBXTV9LRVlMQVNUKSkKKwkgICAgZnByaW50ZihzdGRkZWIsICJUcmFuc2xhdGVNZXNzYWdlKCVzLCAlMDR4LCAlMDhseClcbiIsCisJCVNQWV9HZXRNc2dOYW1lKG1zZy0+bWVzc2FnZSksIG1zZy0+d1BhcmFtLCBtc2ctPmxQYXJhbSk7CisgICAgaWYgKChtZXNzYWdlID09IFdNX0tFWURPV04pIHx8IChtZXNzYWdlID09IFdNX1NZU0tFWURPV04pKQogICAgIHsKLQlkcHJpbnRmX21zZyhzdGRkZWIsICJUcmFuc2xhdGluZyBrZXkgJTA0eCwgc2NhbmNvZGUgJTA0eFxuIiwgbXNnLT53UGFyYW0sIAotCQkJCQkJCSAgICAgIEhJV09SRChtc2ctPmxQYXJhbSkgKTsKKwlpZiAoZGVidWdnaW5nX21zZyB8fCBkZWJ1Z2dpbmdfa2V5KQorCSAgICBmcHJpbnRmKHN0ZGRlYiwgIlRyYW5zbGF0aW5nIGtleSAlMDR4LCBzY2FuY29kZSAlMDR4XG4iLAorCQltc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSApOwogCi0JaWYoIEhJV09SRChtc2ctPmxQYXJhbSkgJiBBU0NJSV9DSEFSX0hBQ0sgKQotCi0JLyogIGlmKCBUb0FzY2lpKCBtc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSwgKExQU1RSKSZLZXlTdGF0ZVRhYmxlLAotCQkJCSAgICAgIHdwYXJhbSwgMCApICkgCi0gICAgICAgICAqLworCS8qIEZJWE1FIDogc2hvdWxkIGhhbmRsZSBUb0FzY2lpIHlpZWxkaW5nIDIgKi8KKwlpZiAoVG9Bc2NpaShtc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSwgKExQU1RSKSZRdWV1ZUtleVN0YXRlVGFibGUsCisJCQkJICAgICAgd3BhcmFtLCAwKSkgCiAJICAgICAgewotICAgICAJCW1lc3NhZ2UgKz0gMiAtIChtZXNzYWdlICYgMHgwMDAxKTsgCisJCS8qIE1hcCBXTV9LRVkqIHRvIFdNXypDSEFSICovCisJCW1lc3NhZ2UgKz0gMiAtIChtZXNzYWdlICYgMHgwMDAxKTsgCiAKLQkgICAgICAgIFBvc3RNZXNzYWdlKCBtc2ctPmh3bmQsIG1lc3NhZ2UsIGxhc3RFdmVudENoYXIsIG1zZy0+bFBhcmFtICk7CisJCVBvc3RNZXNzYWdlKCBtc2ctPmh3bmQsIG1lc3NhZ2UsIHdwYXJhbVswXSwgbXNnLT5sUGFyYW0gKTsKIAotCSAgICAgICAgcmV0dXJuIFRSVUU7CisJCXJldHVybiBUUlVFOwogCSAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IGI0MWE2ZTkuLjQzYWY0NDIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTU5MCwyMCArNTkwLDI4IEBACiAgKi8KIElOVDE2IEV4Y2x1ZGVVcGRhdGVSZ24oIEhEQzMyIGhkYywgSFdORDMyIGh3bmQgKQogewotICAgIElOVDMyIHJldHZhbCA9IEVSUk9SOwotICAgIEhSR04zMiBocmduOworICAgIFJFQ1QxNiByZWN0OwogICAgIFdORCAqIHduZFB0cjsKIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gRVJST1I7Ci0gICAgaWYgKChocmduID0gQ3JlYXRlUmVjdFJnbjMyKCAwLCAwLCAwLCAwICkpICE9IDApCisKKyAgICBpZiAod25kUHRyLT5ocmduVXBkYXRlKQogICAgIHsKLQlyZXR2YWwgPSBDb21iaW5lUmduMzIoIGhyZ24sIElucXVpcmVWaXNSZ24oaGRjKSwKLQkJCSAgICAgICAod25kUHRyLT5ocmduVXBkYXRlPjEpID8gd25kUHRyLT5ocmduVXBkYXRlIDogMCwKLQkJCSAgICAgICAod25kUHRyLT5ocmduVXBkYXRlPjEpID8gUkdOX0RJRkYgOiBSR05fQ09QWSApOwotCWlmIChyZXR2YWwpIFNlbGVjdFZpc1JnbiggaGRjLCBocmduICk7CisJSU5UMTYgIHJldDsKKwlIUkdOMzIgaHJnbiA9IENyZWF0ZVJlY3RSZ24zMih3bmRQdHItPnJlY3RXaW5kb3cubGVmdCAtIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICAgIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgLSB3bmRQdHItPnJlY3RDbGllbnQudG9wLAorCQkJCSAgICAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAtIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAorCQkJCSAgICAgIHduZFB0ci0+cmVjdENsaWVudC5ib3R0b20gLSB3bmRQdHItPnJlY3RDbGllbnQudG9wKTsKKwlpZiggd25kUHRyLT5ocmduVXBkYXRlID4gMSApCisJICAgIENvbWJpbmVSZ24zMihocmduLCB3bmRQdHItPmhyZ25VcGRhdGUsIDAsIFJHTl9DT1BZKTsKKworCS8qIGRvIHVnbHkgY29vcmRpbmF0ZSB0cmFuc2xhdGlvbnMgaW4gZGNlLmMgKi8KKworCXJldCA9IERDRV9FeGNsdWRlUmduKCBoZGMsIHduZFB0ciwgaHJnbiApOwogCURlbGV0ZU9iamVjdDMyKCBocmduICk7Ci0gICAgfQotICAgIHJldHVybiByZXR2YWw7CisJcmV0dXJuIHJldDsKKyAgICB9IAorICAgIHJldHVybiBHZXRDbGlwQm94MTYoaGRjLCAmcmVjdCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IGFlZmYzNWMuLjgzYThjN2QgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTUsMTAgKzUsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicXVldWUuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMjIsNiArMjQsOCBAQAogc3RhdGljIE1FU1NBR0VRVUVVRSAqcE1vdXNlUXVldWUgPSBOVUxMOyAgLyogUXVldWUgZm9yIGxhc3QgbW91c2UgbWVzc2FnZSAqLwogc3RhdGljIE1FU1NBR0VRVUVVRSAqcEtiZFF1ZXVlID0gTlVMTDsgICAgLyogUXVldWUgZm9yIGxhc3Qga2JkIG1lc3NhZ2UgKi8KIAorZXh0ZXJuIHZvaWQgU0lHTkFMX01hc2tBc3luY0V2ZW50cyhCT09MMzIpOworCiBNRVNTQUdFUVVFVUUgKnBDdXJzb3JRdWV1ZSA9IE5VTEw7IAogTUVTU0FHRVFVRVVFICpwQWN0aXZlUXVldWUgPSBOVUxMOwogCkBAIC0xMzcsNiArMTQxLDkgQEAKICAqCSAgICAgUVVFVUVfRGVsZXRlTXNnUXVldWUKICAqCiAgKiBVbmxpbmtzIGFuZCBkZWxldGVzIGEgbWVzc2FnZSBxdWV1ZS4KKyAqCisgKiBOb3RlOiBXZSBuZWVkIHRvIG1hc2sgYXN5bmNocm9ub3VzIGV2ZW50cyB0byBtYWtlIHN1cmUgUG9zdE1lc3NhZ2Ugd29ya3MKKyAqIGV2ZW4gaW4gdGhlIHNpZ25hbCBoYW5kbGVyLgogICovCiBCT09MMzIgUVVFVUVfRGVsZXRlTXNnUXVldWUoIEhRVUVVRTE2IGhRdWV1ZSApCiB7CkBAIC0xNjUsNiArMTcyLDggQEAKICAgICAgIHNlbmRlclEgPSBzcS0+aFByZXZTZW5kaW5nVGFzazsKICAgICB9CiAKKyAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBUUlVFICk7CisKICAgICBwUHJldiA9ICZoRmlyc3RRdWV1ZTsKICAgICB3aGlsZSAoKnBQcmV2ICYmICgqcFByZXYgIT0gaFF1ZXVlKSkKICAgICB7CkBAIC0xNzMsNiArMTgyLDkgQEAKICAgICB9CiAgICAgaWYgKCpwUHJldikgKnBQcmV2ID0gbXNnUXVldWUtPm5leHQ7CiAgICAgbXNnUXVldWUtPnNlbGYgPSAwOworCisgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cyggRkFMU0UgKTsKKwogICAgIEdsb2JhbEZyZWUxNiggaFF1ZXVlICk7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0zMzMsNiArMzQ1LDM5IEBACiAgICAgZHByaW50Zl9tc2coc3RkZGViLCJSZWNlaXZlTWVzc2FnZTogZG9uZSFcbiIpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBRVUVVRV9GbHVzaE1lc3NhZ2UKKyAqIAorICogVHJ5IHRvIHJlcGx5IHRvIGFsbCBwZW5kaW5nIHNlbnQgbWVzc2FnZXMgb24gZXhpdC4KKyAqLwordm9pZCBRVUVVRV9GbHVzaE1lc3NhZ2VzKCBIUVVFVUUxNiBoUXVldWUgKQoreworICBNRVNTQUdFUVVFVUUgKnF1ZXVlID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBoUXVldWUgKTsKKworICBpZiggcXVldWUgKQorICB7CisgICAgTUVTU0FHRVFVRVVFICpzZW5kZXJRID0gKE1FU1NBR0VRVUVVRSopR2xvYmFsTG9jazE2KCBxdWV1ZS0+aFNlbmRpbmdUYXNrKTsKKyAgICBRU01DVFJMKiAgICAgIEN0cmxQdHIgPSBxdWV1ZS0+c21SZXN1bHRDdXJyZW50OworCisgICAgd2hpbGUoIHNlbmRlclEgKQorICAgIHsKKyAgICAgIGlmKCAhKHF1ZXVlLT5oU2VuZGluZ1Rhc2sgPSBzZW5kZXJRLT5oUHJldlNlbmRpbmdUYXNrKSApCisgICAgICAgICAgICBxdWV1ZS0+d2FrZUJpdHMgJj0gflFTX1NFTkRNRVNTQUdFOworICAgICAgUVVFVUVfU2V0V2FrZUJpdCggc2VuZGVyUSwgUVNfU01QQVJBTVNGUkVFICk7CisgICAgICAKKyAgICAgIHF1ZXVlLT5zbVJlc3VsdEN1cnJlbnQgPSBDdHJsUHRyOworICAgICAgd2hpbGUoIHNlbmRlclEtPndha2VCaXRzICYgUVNfU01SRVNVTFQgKSBPbGRZaWVsZCgpOworCisgICAgICBzZW5kZXJRLT5TZW5kTWVzc2FnZVJldHVybiA9IDA7CisgICAgICBzZW5kZXJRLT5zbVJlc3VsdCA9IHF1ZXVlLT5zbVJlc3VsdEN1cnJlbnQ7CisgICAgICBRVUVVRV9TZXRXYWtlQml0KCBzZW5kZXJRLCBRU19TTVJFU1VMVCk7CisKKyAgICAgIGlmKCAoc2VuZGVyUSA9IChNRVNTQUdFUVVFVUUqKUdsb2JhbExvY2sxNiggcXVldWUtPmhTZW5kaW5nVGFzaykpICkKKwkgICBDdHJsUHRyID0gc2VuZGVyUS0+c21SZXN1bHRJbml0OworICAgIH0KKyAgICBxdWV1ZS0+SW5TZW5kTWVzc2FnZUhhbmRsZSA9IDA7CisgIH0gIAorfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBRVUVVRV9BZGRNc2cKQEAgLTM0NCwxMiArMzg5LDE1IEBACiAgICAgaW50IHBvczsKICAgICBNRVNTQUdFUVVFVUUgKm1zZ1F1ZXVlOwogCisgICAgU0lHTkFMX01hc2tBc3luY0V2ZW50cyggVFJVRSApOworCiAgICAgaWYgKCEobXNnUXVldWUgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jazE2KCBoUXVldWUgKSkpIHJldHVybiBGQUxTRTsKICAgICBwb3MgPSBtc2dRdWV1ZS0+bmV4dEZyZWVNZXNzYWdlOwogCiAgICAgICAvKiBDaGVjayBpZiBxdWV1ZSBpcyBmdWxsICovCiAgICAgaWYgKChwb3MgPT0gbXNnUXVldWUtPm5leHRNZXNzYWdlKSAmJiAobXNnUXVldWUtPm1zZ0NvdW50ID4gMCkpCiAgICAgeworCVNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEZBTFNFICk7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCJNU0dfQWRkTXNnIC8vIHF1ZXVlIGlzIGZ1bGwgIVxuIik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC0zNjEsNiArNDA5LDkgQEAKICAgICBlbHNlIHBvcyA9IDA7CiAgICAgbXNnUXVldWUtPm5leHRGcmVlTWVzc2FnZSA9IHBvczsKICAgICBtc2dRdWV1ZS0+bXNnQ291bnQrKzsKKworICAgIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEZBTFNFICk7CisKICAgICBRVUVVRV9TZXRXYWtlQml0KCBtc2dRdWV1ZSwgUVNfUE9TVE1FU1NBR0UgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTQwMyw2ICs0NTQsOCBAQAogICovCiB2b2lkIFFVRVVFX1JlbW92ZU1zZyggTUVTU0FHRVFVRVVFICogbXNnUXVldWUsIGludCBwb3MgKQogeworICAgIFNJR05BTF9NYXNrQXN5bmNFdmVudHMoIFRSVUUgKTsKKwogICAgIGlmIChwb3MgPj0gbXNnUXVldWUtPm5leHRNZXNzYWdlKQogICAgIHsKIAlmb3IgKCA7IHBvcyA+IG1zZ1F1ZXVlLT5uZXh0TWVzc2FnZTsgcG9zLS0pCkBAIC00MjAsNiArNDczLDggQEAKICAgICB9CiAgICAgbXNnUXVldWUtPm1zZ0NvdW50LS07CiAgICAgaWYgKCFtc2dRdWV1ZS0+bXNnQ291bnQpIG1zZ1F1ZXVlLT53YWtlQml0cyAmPSB+UVNfUE9TVE1FU1NBR0U7CisKKyAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOwogfQogCiAKQEAgLTYzMywxMiArNjg4LDE4IEBACiAgICAgfQogICAgIHF1ZXVlUHRyID0gKE1FU1NBR0VRVUVVRSAqKUdsb2JhbExvY2sxNiggaE5ld1F1ZXVlICk7CiAKKyAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBUUlVFICk7CisKICAgICAvKiBDb3B5IGRhdGEgYW5kIGZyZWUgdGhlIG9sZCBtZXNzYWdlIHF1ZXVlICovCiAgICAgaWYgKChoUXVldWUgPSBHZXRUYXNrUXVldWUoMCkpICE9IDApIAogICAgIHsKICAgICAgICBNRVNTQUdFUVVFVUUgKm9sZFEgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jazE2KCBoUXVldWUgKTsKICAgICAgICBtZW1jcHkoICZxdWV1ZVB0ci0+cmVzZXJ2ZWQyLCAmb2xkUS0+cmVzZXJ2ZWQyLCAKIAkJCShpbnQpb2xkUS0+bWVzc2FnZXMgLSAoaW50KSgmb2xkUS0+cmVzZXJ2ZWQyKSApOworICAgICAgIEhPT0tfUmVzZXRRdWV1ZUhvb2tzKCBoTmV3UXVldWUgKTsKKyAgICAgICBpZiggV0lOX0dldERlc2t0b3AoKS0+aG1lbVRhc2tRID09IGhRdWV1ZSApCisJICAgV0lOX0dldERlc2t0b3AoKS0+aG1lbVRhc2tRID0gaE5ld1F1ZXVlOworICAgICAgIFdJTl9SZXNldFF1ZXVlV2luZG93cyggV0lOX0dldERlc2t0b3AoKS0+Y2hpbGQsIGhRdWV1ZSwgaE5ld1F1ZXVlICk7CiAgICAgICAgUVVFVUVfRGVsZXRlTXNnUXVldWUoIGhRdWV1ZSApOwogICAgIH0KIApAQCAtNjQ4LDggKzcwOSw5IEBACiAgICAgaEZpcnN0UXVldWUgPSBoTmV3UXVldWU7CiAgICAgCiAgICAgaWYoICFxdWV1ZVB0ci0+bmV4dCApIHBDdXJzb3JRdWV1ZSA9IHF1ZXVlUHRyOwotCiAgICAgU2V0VGFza1F1ZXVlKCAwLCBoTmV3UXVldWUgKTsKKyAgICAKKyAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOwogICAgIHJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL3Njcm9sbC5jIGIvd2luZG93cy9zY3JvbGwuYwppbmRleCA3MWVjYzk4Li5iNDE2NTM3IDEwMDY0NAotLS0gYS93aW5kb3dzL3Njcm9sbC5jCisrKyBiL3dpbmRvd3Mvc2Nyb2xsLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgIGlmKCByZWN0Q2xpcC5sZWZ0ID49IHJlY3RDbGlwLnJpZ2h0IHx8IHJlY3RDbGlwLnRvcCA+PSByZWN0Q2xpcC5ib3R0b20gKQogCXJldHVybiBGQUxTRTsKICAgICAKLSAgICBocmduQ2xpcCA9IEdldENsaXBSZ24oaGRjKTsKKyAgICBocmduQ2xpcCA9IEdldENsaXBSZ24xNihoZGMpOwogICAgIGhyZ25TY3JvbGxDbGlwID0gQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIoJnJlY3RDbGlwKTsKIAogICAgIGlmKCBocmduQ2xpcCApCmRpZmYgLS1naXQgYS93aW5kb3dzL3N5c2NvbG9yLmMgYi93aW5kb3dzL3N5c2NvbG9yLmMKaW5kZXggNzQ0MWJlMS4uNTk2ZWNlYiAxMDA2NDQKLS0tIGEvd2luZG93cy9zeXNjb2xvci5jCisrKyBiL3dpbmRvd3Mvc3lzY29sb3IuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKICAgICBmb3IgKGkgPSAwLCBwID0gRGVmU3lzQ29sb3JzOyBpIDwgTlVNX1NZU19DT0xPUlM7IGkrKywgcCArPSAyKQogICAgIHsKLQlHZXRQcm9maWxlU3RyaW5nKCAiY29sb3JzIiwgcFswXSwgcFsxXSwgYnVmZmVyLCAxMDAgKTsKKwlHZXRQcm9maWxlU3RyaW5nMzJBKCAiY29sb3JzIiwgcFswXSwgcFsxXSwgYnVmZmVyLCAxMDAgKTsKIAlpZiAoIXNzY2FuZiggYnVmZmVyLCAiICVkICVkICVkIiwgJnIsICZnLCAmYiApKSByID0gZyA9IGIgPSAwOwogCVNZU0NPTE9SX1NldENvbG9yKCBpLCBSR0IocixnLGIpICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9zeXNtZXRyaWNzLmMgYi93aW5kb3dzL3N5c21ldHJpY3MuYwppbmRleCA2NGI4MGRjLi41MzI1YTg2IDEwMDY0NAotLS0gYS93aW5kb3dzL3N5c21ldHJpY3MuYworKysgYi93aW5kb3dzL3N5c21ldHJpY3MuYwpAQCAtNTEsMTUgKzUxLDE1IEBACiAgICAgc3lzTWV0cmljc1tTTV9DWU1JTl0gPSBTWVNNRVRSSUNTX0NZTUlOOwogICAgIHN5c01ldHJpY3NbU01fQ1hTSVpFXSA9IFNZU01FVFJJQ1NfQ1hTSVpFOwogICAgIHN5c01ldHJpY3NbU01fQ1lTSVpFXSA9IFNZU01FVFJJQ1NfQ1lTSVpFOwotICAgIHN5c01ldHJpY3NbU01fQ1hGUkFNRV0gPSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsICJCb3JkZXJXaWR0aCIsIDQgKTsKKyAgICBzeXNNZXRyaWNzW1NNX0NYRlJBTUVdID0gR2V0UHJvZmlsZUludDMyQSggIndpbmRvd3MiLCAiQm9yZGVyV2lkdGgiLCA0ICk7CiAgICAgc3lzTWV0cmljc1tTTV9DWUZSQU1FXSA9IHN5c01ldHJpY3NbU01fQ1hGUkFNRV07CiAgICAgc3lzTWV0cmljc1tTTV9DWE1JTlRSQUNLXSA9IFNZU01FVFJJQ1NfQ1hNSU5UUkFDSzsKICAgICBzeXNNZXRyaWNzW1NNX0NZTUlOVFJBQ0tdID0gU1lTTUVUUklDU19DWU1JTlRSQUNLOwotICAgIHN5c01ldHJpY3NbU01fQ1hET1VCTEVDTEtdID0gKEdldFByb2ZpbGVJbnQoICJ3aW5kb3dzIiwiRG91YmxlQ2xpY2tXaWR0aCIsIDQpICsgMSkgJiB+MTsKLSAgICBzeXNNZXRyaWNzW1NNX0NZRE9VQkxFQ0xLXSA9IChHZXRQcm9maWxlSW50KCAid2luZG93cyIsIkRvdWJsZUNsaWNrSGVpZ2h0IiwgNCkgKyAxKSAmIH4xOwotICAgIHN5c01ldHJpY3NbU01fQ1hJQ09OU1BBQ0lOR10gPSBHZXRQcm9maWxlSW50KCAiZGVza3RvcCIsIkljb25TcGFjaW5nIiwgNzUpOwotICAgIHN5c01ldHJpY3NbU01fQ1lJQ09OU1BBQ0lOR10gPSBHZXRQcm9maWxlSW50KCAiZGVza3RvcCIsIkljb25WZXJ0aWNhbFNwYWNpbmciLCA3Mik7Ci0gICAgc3lzTWV0cmljc1tTTV9NRU5VRFJPUEFMSUdOTUVOVF0gPSBHZXRQcm9maWxlSW50KCAid2luZG93cyIsIk1lbnVEcm9wQWxpZ25tZW50IiwgMCApOworICAgIHN5c01ldHJpY3NbU01fQ1hET1VCTEVDTEtdID0gKEdldFByb2ZpbGVJbnQzMkEoICJ3aW5kb3dzIiwiRG91YmxlQ2xpY2tXaWR0aCIsIDQpICsgMSkgJiB+MTsKKyAgICBzeXNNZXRyaWNzW1NNX0NZRE9VQkxFQ0xLXSA9IChHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsIkRvdWJsZUNsaWNrSGVpZ2h0IiwgNCkgKyAxKSAmIH4xOworICAgIHN5c01ldHJpY3NbU01fQ1hJQ09OU1BBQ0lOR10gPSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsIkljb25TcGFjaW5nIiwgNzUpOworICAgIHN5c01ldHJpY3NbU01fQ1lJQ09OU1BBQ0lOR10gPSBHZXRQcm9maWxlSW50MzJBKCAiZGVza3RvcCIsIkljb25WZXJ0aWNhbFNwYWNpbmciLCA3Mik7CisgICAgc3lzTWV0cmljc1tTTV9NRU5VRFJPUEFMSUdOTUVOVF0gPSBHZXRQcm9maWxlSW50MzJBKCAid2luZG93cyIsIk1lbnVEcm9wQWxpZ25tZW50IiwgMCApOwogICAgIHN5c01ldHJpY3NbU01fUEVOV0lORE9XU10gPSAwOwogICAgIHN5c01ldHJpY3NbU01fREJDU0VOQUJMRURdID0gMDsKICAgICBzeXNNZXRyaWNzW1NNX0NNRVRSSUNTXSA9IFNNX0NNRVRSSUNTOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggZjliNzBlZS4uMmI0OGRlMyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0zNzQsMjQgKzM3NCwyNCBAQAogICAgIFVTRVJfSEVBUF9GUkVFKCBod25kICk7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgICAgIFdJTl9EZXN0cm95UXVldWVXaW5kb3dzCisgKiAgICAgICAgICAgV0lOX1Jlc2V0UXVldWVXaW5kb3dzCiAgKi8KLXZvaWQgV0lOX0Rlc3Ryb3lRdWV1ZVdpbmRvd3MoIFdORCogd25kLCBIUVVFVUUxNiBoUXVldWUgKQordm9pZCBXSU5fUmVzZXRRdWV1ZVdpbmRvd3MoIFdORCogd25kLCBIUVVFVUUxNiBoUXVldWUsIEhRVUVVRTE2IGhOZXcgKQogewogICAgIFdORCogbmV4dDsKIAogICAgIHdoaWxlICh3bmQpCiAgICAgewogICAgICAgICBuZXh0ID0gd25kLT5uZXh0OwotICAgICAgICBpZiAod25kLT5obWVtVGFza1EgPT0gaFF1ZXVlKSBEZXN0cm95V2luZG93KCB3bmQtPmh3bmRTZWxmICk7Ci0gICAgICAgIGVsc2UgV0lOX0Rlc3Ryb3lRdWV1ZVdpbmRvd3MoIHduZC0+Y2hpbGQsIGhRdWV1ZSApOworICAgICAgICBpZiAod25kLT5obWVtVGFza1EgPT0gaFF1ZXVlKQorCSAgIGlmKCBoTmV3ICkgd25kLT5obWVtVGFza1EgPSBoTmV3OworCSAgIGVsc2UgRGVzdHJveVdpbmRvdyggd25kLT5od25kU2VsZiApOworICAgICAgICBlbHNlIFdJTl9SZXNldFF1ZXVlV2luZG93cyggd25kLT5jaGlsZCwgaFF1ZXVlLCBoTmV3ICk7CiAgICAgICAgIHduZCA9IG5leHQ7CiAgICAgfQogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdJTl9DcmVhdGVEZXNrdG9wV2luZG93CiAgKgpAQCAtNzM2LDggKzczNiwxMiBAQAogICAgIH0KICAgICBlbHNlIHduZFB0ci0+d0lEbWVudSA9IChVSU5UKWNzLT5oTWVudTsKIAotICAgIC8qIFNlbmQgdGhlIFdNX0NSRUFURSBtZXNzYWdlICovCisgICAgLyogU2VuZCB0aGUgV01fQ1JFQVRFIG1lc3NhZ2UgCisgICAgICogUGVyaGFwcyB3ZSBzaG91bGRuJ3QgYWxsb3cgd2lkdGgvaGVpZ2h0IGNoYW5nZXMgYXMgd2VsbC4gCisgICAgICogU2VlIHAzMjcgaW4gIkludGVybmFscyIuIAorICAgICAqLwogCisgICAgbWF4UG9zLnggPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsgbWF4UG9zLnkgPSB3bmRQdHItPnJlY3RXaW5kb3cudG9wOwogICAgIGlmICh1bmljb2RlKQogICAgIHsKICAgICAgICAgaWYgKCFTZW5kTWVzc2FnZTMyVyggaHduZCwgV01fTkNDUkVBVEUsIDAsIChMUEFSQU0pY3MpKSB3bWNyZWF0ZSA9IC0xOwpAQCAtNzQ1LDYgKzc0OSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFdJTlBPU19TZW5kTkNDYWxjU2l6ZSggaHduZCwgRkFMU0UsICZ3bmRQdHItPnJlY3RXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDAsICZ3bmRQdHItPnJlY3RDbGllbnQgKTsKKwkgICAgT2Zmc2V0UmVjdDE2KCZ3bmRQdHItPnJlY3RXaW5kb3csIG1heFBvcy54IC0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQsCisJCQkJCSAgICBtYXhQb3MueSAtIHduZFB0ci0+cmVjdFdpbmRvdy50b3ApOwogICAgICAgICAgICAgd21jcmVhdGUgPSBTZW5kTWVzc2FnZTMyVyggaHduZCwgV01fQ1JFQVRFLCAwLCAoTFBBUkFNKWNzICk7CiAgICAgICAgIH0KICAgICB9CkBAIC03NTUsNiArNzYxLDggQEAKICAgICAgICAgewogICAgICAgICAgICAgV0lOUE9TX1NlbmROQ0NhbGNTaXplKCBod25kLCBGQUxTRSwgJnduZFB0ci0+cmVjdFdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCwgJnduZFB0ci0+cmVjdENsaWVudCApOworICAgICAgICAgICAgT2Zmc2V0UmVjdDE2KCZ3bmRQdHItPnJlY3RXaW5kb3csIG1heFBvcy54IC0gd25kUHRyLT5yZWN0V2luZG93LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvcy55IC0gd25kUHRyLT5yZWN0V2luZG93LnRvcCk7CiAgICAgICAgICAgICB3bWNyZWF0ZSA9IFNlbmRNZXNzYWdlMzJBKCBod25kLCBXTV9DUkVBVEUsIDAsIChMUEFSQU0pY3MgKTsKICAgICAgICAgfQogICAgIH0KQEAgLTc5OSw3ICs4MDcsNiBAQAogICAgIHsKIAkvKiBNaW5NYXhpbWl6ZShod25kLCBTV19TSE9XTUFYSU1JWkVELCAxKSAqLwogCi0gICAgICAgIFBPSU5UMTYgbWF4U2l6ZSwgbWF4UG9zLCBtaW5UcmFjaywgbWF4VHJhY2s7CiAgICAgICAgIE5DX0dldE1pbk1heEluZm8oIHduZFB0ciwgJm1heFNpemUsICZtYXhQb3MsICZtaW5UcmFjaywgJm1heFRyYWNrICk7CiAgICAgICAgIFNldFdpbmRvd1BvcyggaHduZCwgMCwgbWF4UG9zLngsIG1heFBvcy55LCBtYXhTaXplLngsIG1heFNpemUueSwKICAgICAgICAgICAgICgoR2V0QWN0aXZlV2luZG93KCkpPyBTV1BfTk9BQ1RJVkFURSA6IDApIHwgU1dQX0ZSQU1FQ0hBTkdFRCApOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wcm9jLmMgYi93aW5kb3dzL3dpbnByb2MuYwppbmRleCBhYTIxMmU3Li4yZmE1ZjVkIDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbnByb2MuYworKysgYi93aW5kb3dzL3dpbnByb2MuYwpAQCAtOTY0LDYgKzk2NCw4MiBAQAogICAgIGNhc2UgQk1fU0VUU1RZTEUzMjoKICAgICAgICAgKnBtc2cxNiA9IChVSU5UMTYpbXNnMzIgKyAoQk1fR0VUQ0hFQ0sxNiAtIEJNX0dFVENIRUNLMzIpOwogICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIExCX0NBUkVUT0ZGMzI6CisgICAgY2FzZSBMQl9DQVJFVE9OMzI6CisgICAgY2FzZSBMQl9ERUxFVEVTVFJJTkczMjoKKyAgICBjYXNlIExCX0dFVEFOQ0hPUklOREVYMzI6CisgICAgY2FzZSBMQl9HRVRDQVJFVElOREVYMzI6CisgICAgY2FzZSBMQl9HRVRDT1VOVDMyOgorICAgIGNhc2UgTEJfR0VUQ1VSU0VMMzI6CisgICAgY2FzZSBMQl9HRVRIT1JJWk9OVEFMRVhURU5UMzI6CisgICAgY2FzZSBMQl9HRVRJVEVNREFUQTMyOgorICAgIGNhc2UgTEJfR0VUSVRFTUhFSUdIVDMyOgorICAgIGNhc2UgTEJfR0VUU0VMMzI6CisgICAgY2FzZSBMQl9HRVRTRUxDT1VOVDMyOgorICAgIGNhc2UgTEJfR0VUVEVYVExFTjMyOgorICAgIGNhc2UgTEJfR0VUVE9QSU5ERVgzMjoKKyAgICBjYXNlIExCX1JFU0VUQ09OVEVOVDMyOgorICAgIGNhc2UgTEJfU0VMSVRFTVJBTkdFMzI6CisgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0VFWDMyOgorICAgIGNhc2UgTEJfU0VUQU5DSE9SSU5ERVgzMjoKKyAgICBjYXNlIExCX1NFVENBUkVUSU5ERVgzMjoKKyAgICBjYXNlIExCX1NFVENPTFVNTldJRFRIMzI6CisgICAgY2FzZSBMQl9TRVRDVVJTRUwzMjoKKyAgICBjYXNlIExCX1NFVEhPUklaT05UQUxFWFRFTlQzMjoKKyAgICBjYXNlIExCX1NFVElURU1EQVRBMzI6CisgICAgY2FzZSBMQl9TRVRJVEVNSEVJR0hUMzI6CisgICAgY2FzZSBMQl9TRVRTRUwzMjoKKyAgICBjYXNlIExCX1NFVFRPUElOREVYMzI6CisgICAgICAgICpwbXNnMTYgPSAoVUlOVDE2KW1zZzMyICsgKExCX0FERFNUUklORzE2IC0gTEJfQUREU1RSSU5HMzIpOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIExCX0FERFNUUklORzMyOgorICAgIGNhc2UgTEJfRklORFNUUklORzMyOgorICAgIGNhc2UgTEJfRklORFNUUklOR0VYQUNUMzI6CisgICAgY2FzZSBMQl9JTlNFUlRTVFJJTkczMjoKKyAgICBjYXNlIExCX1NFTEVDVFNUUklORzMyOgorICAgIGNhc2UgTEJfRElSMzI6CisgICAgY2FzZSBMQl9BRERGSUxFMzI6CisvKiAgICBjYXNlIExCX0dFVFRFWFQzMjogRklYTUUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgTFBTVFIgc3RyID0gU0VHUFRSX1NUUkRVUCggKExQU1RSKSpwbHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIXN0cikgcmV0dXJuIC0xOworICAgICAgICAgICAgKnBscGFyYW0gPSAoTFBBUkFNKVNFR1BUUl9HRVQoc3RyKTsKKyAgICAgICAgfQorICAgICAgICAqcG1zZzE2ID0gKFVJTlQxNiltc2czMiArIChMQl9BRERTVFJJTkcxNiAtIExCX0FERFNUUklORzMyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBMQl9HRVRJVEVNUkVDVDMyOgorICAgICAgICB7CisgICAgICAgICAgICBSRUNUMTYgKnJlY3Q7CisgICAgICAgICAgICByZWN0ID0gKFJFQ1QxNiAqKVNFR1BUUl9BTExPQyggc2l6ZW9mKFJFQ1QxNikgKyBzaXplb2YoTFBBUkFNKSApOworICAgICAgICAgICAgaWYgKCFyZWN0KSByZXR1cm4gLTE7CisgICAgICAgICAgICAqKExQQVJBTSAqKShyZWN0ICsgMSkgPSAqcGxwYXJhbTsgIC8qIFN0b3JlIHRoZSBwcmV2aW91cyBsUGFyYW0gKi8KKyAgICAgICAgICAgICpwbHBhcmFtID0gKExQQVJBTSlTRUdQVFJfR0VUKHJlY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgTEJfR0VUU0VMSVRFTVMzMjoKKyAgICAgICAgeworICAgICAgICAgICAgTFBJTlQxNiBpdGVtczsKKyAgICAgICAgICAgICpwd3BhcmFtMTYgPSAoV1BBUkFNMTYpTUlOKCB3UGFyYW0zMiwgMHg3ZjgwICk7IC8qIE11c3QgYmUgPCA2NEsgKi8KKyAgICAgICAgICAgIGlmICghKGl0ZW1zID0gU0VHUFRSX0FMTE9DKCAqcHdwYXJhbTE2ICogc2l6ZW9mKElOVDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKExQQVJBTSkpKSkgcmV0dXJuIC0xOworICAgICAgICAgICAgKigoTFBBUkFNICopaXRlbXMpKysgPSAqcGxwYXJhbTsgIC8qIFN0b3JlIHRoZSBwcmV2aW91cyBsUGFyYW0gKi8KKyAgICAgICAgICAgICpwbHBhcmFtID0gKExQQVJBTSlTRUdQVFJfR0VUKGl0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIExCX1NFVFRBQlNUT1BTMzI6CisgICAgICAgIGlmICh3UGFyYW0zMikKKyAgICAgICAgeworICAgICAgICAgICAgSU5UMzIgaTsKKyAgICAgICAgICAgIExQSU5UMTYgc3RvcHM7CisgICAgICAgICAgICAqcHdwYXJhbTE2ID0gKFdQQVJBTTE2KU1JTiggd1BhcmFtMzIsIDB4N2Y4MCApOyAvKiBNdXN0IGJlIDwgNjRLICovCisgICAgICAgICAgICBpZiAoIShzdG9wcyA9IFNFR1BUUl9BTExPQyggKnB3cGFyYW0xNiAqIHNpemVvZihJTlQxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihMUEFSQU0pKSkpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAqcHdwYXJhbTE2OyBpKyspIHN0b3BzW2ldID0gKigoTFBJTlQzMikqcGxwYXJhbStpKTsKKyAgICAgICAgICAgICpwbHBhcmFtID0gKExQQVJBTSlTRUdQVFJfR0VUKHN0b3BzKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpwbXNnMTYgPSBMQl9TRVRUQUJTVE9QUzE2OworICAgICAgICByZXR1cm4gMDsKICAgICBjYXNlIFdNX0FDVElWQVRFOgogICAgIGNhc2UgV01fQ0hBUlRPSVRFTToKICAgICBjYXNlIFdNX0NPTU1BTkQ6CkBAIC0xMTczLDE1ICsxMjQ5LDQxIEBACiAgKgogICogVW5tYXAgYSBtZXNzYWdlIHRoYXQgd2FzIG1hcHBlZCBmcm9tIDMyLWJpdCBBbnNpIHRvIDE2LWJpdC4KICAqLwotdm9pZCBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggVUlOVDE2IG1zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKK3ZvaWQgV0lOUFJPQ19Vbm1hcE1zZzMyQVRvMTYoIFVJTlQzMiBtc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgc3dpdGNoKG1zZykKICAgICB7CisgICAgY2FzZSBMQl9BRERGSUxFMzI6CisgICAgY2FzZSBMQl9BRERTVFJJTkczMjoKKyAgICBjYXNlIExCX0RJUjMyOgorICAgIGNhc2UgTEJfRklORFNUUklORzMyOgorICAgIGNhc2UgTEJfRklORFNUUklOR0VYQUNUMzI6CisgICAgY2FzZSBMQl9JTlNFUlRTVFJJTkczMjoKKyAgICBjYXNlIExCX1NFTEVDVFNUUklORzMyOgorICAgIGNhc2UgTEJfU0VUVEFCU1RPUFMzMjoKICAgICBjYXNlIFdNX0NPTVBBUkVJVEVNOgogICAgIGNhc2UgV01fREVMRVRFSVRFTToKICAgICBjYXNlIFdNX0RSQVdJVEVNOgorICAgIGNhc2UgV01fU0VUVEVYVDoKICAgICAgICAgU0VHUFRSX0ZSRUUoIFBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMQl9HRVRJVEVNUkVDVDMyOgorICAgICAgICB7CisgICAgICAgICAgICBSRUNUMTYgKnJlY3QgPSAoUkVDVDE2ICopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgICAgIGxQYXJhbSA9ICooTFBBUkFNICopKHJlY3QgKyAxKTsKKyAgICAgICAgICAgIENPTlZfUkVDVDE2VE8zMiggcmVjdCwgKFJFQ1QzMiAqKWxQYXJhbSApOworICAgICAgICAgICAgU0VHUFRSX0ZSRUUoIHJlY3QgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExCX0dFVFNFTElURU1TMzI6CisgICAgICAgIHsKKyAgICAgICAgICAgIElOVDMyIGk7CisgICAgICAgICAgICBMUElOVDE2IGl0ZW1zID0gKExQSU5UMTYpUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKyAgICAgICAgICAgIGxQYXJhbSA9ICooKExQQVJBTSAqKWl0ZW1zIC0gMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd1BhcmFtOyBpKyspICooKExQSU5UMzIpbFBhcmFtICsgaSkgPSBpdGVtc1tpXTsKKyAgICAgICAgICAgIFNFR1BUUl9GUkVFKCAoTFBBUkFNICopaXRlbXMgLSAxICk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXTV9NRUFTVVJFSVRFTToKICAgICAgICAgewogICAgICAgICAgICAgTUVBU1VSRUlURU1TVFJVQ1QxNiAqbWlzID0gKE1FQVNVUkVJVEVNU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwpAQCAtMTI0Miw5ICsxMzQ0LDYgQEAKICAgICAgICAgICAgIFNFR1BUUl9GUkVFKCBjcyApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgV01fU0VUVEVYVDoKLSAgICAgICAgU0VHUFRSX0ZSRUUoIFBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKLSAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXTV9XSU5ET1dQT1NDSEFOR0lORzoKICAgICBjYXNlIFdNX1dJTkRPV1BPU0NIQU5HRUQ6CiAgICAgICAgIHsKQEAgLTEyNjksNiArMTM2OCwyMiBAQAogewogICAgIHN3aXRjaChtc2czMikKICAgICB7CisgICAgY2FzZSBMQl9BRERTVFJJTkczMjoKKyAgICBjYXNlIExCX0ZJTkRTVFJJTkczMjoKKyAgICBjYXNlIExCX0ZJTkRTVFJJTkdFWEFDVDMyOgorICAgIGNhc2UgTEJfSU5TRVJUU1RSSU5HMzI6CisgICAgY2FzZSBMQl9TRUxFQ1RTVFJJTkczMjoKKyAgICBjYXNlIExCX0RJUjMyOgorICAgIGNhc2UgTEJfQURERklMRTMyOgorICAgICAgICB7CisgICAgICAgICAgICBMUFNUUiBzdHIgPSBTRUdQVFJfQUxMT0MoIGxzdHJsZW4zMlcoKExQV1NUUikqcGxwYXJhbSkgKyAxICk7CisgICAgICAgICAgICBpZiAoIXN0cikgcmV0dXJuIC0xOworICAgICAgICAgICAgU1RSSU5HMzJfVW5pVG9BbnNpKCBzdHIsIChMUFdTVFIpKnBscGFyYW0gKTsKKyAgICAgICAgICAgICpwbXNnMTYgPSAoVUlOVDE2KW1zZzMyICsgKExCX0FERFNUUklORzE2IC0gTEJfQUREU1RSSU5HMzIpOworICAgICAgICAgICAgKnB3cGFyYW0xNiA9IChXUEFSQU0xNilMT1dPUkQod1BhcmFtMzIpOworICAgICAgICAgICAgKnBscGFyYW0gICA9IChMUEFSQU0pU0VHUFRSX0dFVChzdHIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgV01fTkNDUkVBVEU6CiAgICAgY2FzZSBXTV9DUkVBVEU6CiAgICAgICAgIHsKQEAgLTEzNDQsNyArMTQ1OSw3IEBACiAgKgogICogVW5tYXAgYSBtZXNzYWdlIHRoYXQgd2FzIG1hcHBlZCBmcm9tIDMyLWJpdCBVbmljb2RlIHRvIDE2LWJpdC4KICAqLwotdm9pZCBXSU5QUk9DX1VubWFwTXNnMzJXVG8xNiggVUlOVDE2IG1zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKK3ZvaWQgV0lOUFJPQ19Vbm1hcE1zZzMyV1RvMTYoIFVJTlQzMiBtc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7CiAgICAgc3dpdGNoKG1zZykKICAgICB7CkBAIC0xNDYxLDcgKzE1NzYsNyBAQAogICAgIGlmICh3bmRQdHIpIENVUlJFTlRfRFMgPSB3bmRQdHItPmhJbnN0YW5jZTsKICAgICByZXN1bHQgPSBDYWxsV25kUHJvYzE2KCBmdW5jLCBod25kLCBtc2cxNiwgd1BhcmFtMTYsIGxQYXJhbSApOwogICAgIENVUlJFTlRfRFMgPSBkczsKLSAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnMTYsIHdQYXJhbTE2LCBsUGFyYW0gKTsKKyAgICBXSU5QUk9DX1VubWFwTXNnMzJBVG8xNiggbXNnLCB3UGFyYW0xNiwgbFBhcmFtICk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTQ4Niw3ICsxNjAxLDcgQEAKICAgICBpZiAod25kUHRyKSBDVVJSRU5UX0RTID0gd25kUHRyLT5oSW5zdGFuY2U7CiAgICAgcmVzdWx0ID0gQ2FsbFduZFByb2MxNiggZnVuYywgaHduZCwgbXNnMTYsIHdQYXJhbTE2LCBsUGFyYW0gKTsKICAgICBDVVJSRU5UX0RTID0gZHM7Ci0gICAgV0lOUFJPQ19Vbm1hcE1zZzMyV1RvMTYoIG1zZzE2LCB3UGFyYW0xNiwgbFBhcmFtICk7CisgICAgV0lOUFJPQ19Vbm1hcE1zZzMyV1RvMTYoIG1zZywgd1BhcmFtMTYsIGxQYXJhbSApOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbmUubWFuIGIvd2luZS5tYW4KaW5kZXggM2U3MWMxYS4uMDI0NzE2NCAxMDA2NDQKLS0tIGEvd2luZS5tYW4KKysrIGIvd2luZS5tYW4KQEAgLTksNyArOSw3IEBACiBdCiAuSSBwcm9ncmFtX25hbWUKIFsKLS5JIGFyZ3VtZW50cworLkkgcHJvZ3JhbV9uYW1lLi4uCiBdCiAuU0ggREVTQ1JJUFRJT04KIC5CIHdpbmUK