ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKaW5kZXggMjM2OGMyMi4uNTZiYzMwMiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvTWFrZWZpbGUKQEAgLTIyMSw4ICsyMjEsOCBAQAogI1RQTQogb2JqLSQoQ09ORklHX01WX1RQTSkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vCiAKLSNDVVNUCi1vYmotJChDT05GSUdfTVZfQ1VTVCkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0LworI0NQSAorb2JqLSQoQ09ORklHX01WX0NQSCkgKz0gLi4vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvCiAKICNNQUNfTEVBUk4KIG9iai0kKENPTkZJR19NVl9NQUNfTEVBUk4pICs9IC4uL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbWFjX2xlYXJuLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvY29uZmlnL212UnVsZXMubWsgYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9jb25maWcvbXZSdWxlcy5tawppbmRleCA3YzQ0YTVkLi4xZWZiOWI5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9jb25maWcvbXZSdWxlcy5taworKysgYi9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9jb25maWcvbXZSdWxlcy5tawpAQCAtNjMsOCArNjMsOCBAQAogTFNQX1RQTV9QTEFUX0RJUiAgPSAkKFBMQVRfRFJJVkVSUykvbXZfdHBtL3BsYXQKIGVuZGlmCiAKLWlmZXEgKCQoQ09ORklHX01WX0lOQ0xVREVfQ1VTVCkseSkKLUxTUF9DVVNUX0NPUkVfRElSICA9ICQoUExBVF9EUklWRVJTKS9tdl9jdXN0CitpZmVxICgkKENPTkZJR19NVl9JTkNMVURFX0NQSCkseSkKK0xTUF9DUEhfQ09SRV9ESVIgID0gJChQTEFUX0RSSVZFUlMpL212X2NwaAogZW5kaWYKIAogTFNQX0VaWE1MX0RJUiAgICAgPSAkKFBMQVRfRFJJVkVSUykvbXZfZXp4bWwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaCBiL2FyY2gvYXJtL21hY2gtZmVyb2Nlb24ta3cyL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaAppbmRleCA2Y2FiNDYzLi5iNDI2ZmVlIDEwMDc1NQotLS0gYS9hcmNoL2FybS9tYWNoLWZlcm9jZW9uLWt3Mi9pbmNsdWRlL21hY2gvc3lzdGVtLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1mZXJvY2Vvbi1rdzIvaW5jbHVkZS9tYWNoL3N5c3RlbS5oCkBAIC0zMSw3ICszMSw3IEBACiAJY3B1X2RvX2lkbGUoKTsKIH0KIAotI2RlZmluZSBVUE9OX1NES19WRVJTSU9OICJ1UE9OXzIuNi4yNV9SQzc3IgorI2RlZmluZSBVUE9OX1NES19WRVJTSU9OICJ1UE9OXzIuNy4yNV9SQzUiCiAKICNpZmRlZiBfX0JJR19FTkRJQU4KICNkZWZpbmUgTVZfQVJNXzMyQklUX0xFKFgpICgoKChYKSYweGZmKTw8MjQpIHwgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vS2NvbmZpZwppbmRleCBhOTk0NDhlLi4xM2NkNTQwIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9LY29uZmlnCkBAIC0xMjEsOCArMTIxLDggQEAKICAgICAgICAgLS0taGVscC0tLQogICAgICAgICBQbGVhc2UgZG9uJ3QgY2hhbmdlIHRoaXMgY29uZmlncyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCi1jb25maWcgTVZfSU5DTFVERV9DVVNUCi0JYm9vbCAiQ3VzdG9tZXIgZHJpdmVyIFN1cHBvcnQiCitjb25maWcgTVZfSU5DTFVERV9DUEgKKwlib29sICJDUEggU3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1WODhGNjUwMAogCWRlZmF1bHQgeQogICAgICAgICAtLS1oZWxwLS0tCkBAIC00MDMsNyArNDAzLDcgQEAKIAogc291cmNlIGFyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHN1L0tjb25maWcKIAotc291cmNlIGFyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9LY29uZmlnCitzb3VyY2UgYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvS2NvbmZpZwogCiBzb3VyY2UgYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vS2NvbmZpZwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ODVlODM5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvS2NvbmZpZwpAQCAtMCwwICsxLDM3IEBACittZW51ICJTb0MgQ1BIIHN1cHBvcnQiCitkZXBlbmRzIG9uIE1WX0lOQ0xVREVfQ1BICisKK2NvbmZpZyAgTVZfQ1BICisgICAgICAgIGJvb2wgIlN1cHBvcnQgZm9yIE1hcnZlbGwgQ1BVIFBhY2tldCBIYW5kbGVyIERyaXZlciIKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKworY29tbWVudCAiQ1BIIERyaXZlciBPcHRpb25zIgorZGVwZW5kcyBvbiBNVl9DUEgKKworY29uZmlnICBNVl9DUEhfSUdNUF9IQU5ETEUKKyAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NQSCBJR01QIGhhbmRsaW5nIgorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgLS0taGVscC0tLQorCitjb25maWcgIE1WX0NQSF9NTERfSEFORExFCisgICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DUEggTUxEIGhhbmRsaW5nIgorICAgICAgICBkZWZhdWx0IHkKKyAgICAgICAgLS0taGVscC0tLQorCitjb25maWcgIE1WX0NQSF9CQ19IQU5ETEUKKyAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NQSCBicm9hZGNhc3QgaGFuZGxpbmciCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tCisgICAgICAgIAorY29uZmlnICBNVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKKyAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NQSCBzYW1wbGUgVURQIGhhbmRsaW5nIgorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgLS0taGVscC0tLQorCitjb25maWcgIE1WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICAgICAgYm9vbCAiRW5hYmxlIE1WX0NQSCBmbG93IG1hcHBpbmcgaGFuZGxpbmciCisgICAgICAgIGRlZmF1bHQgeQorICAgICAgICAtLS1oZWxwLS0tICAgICAgICAKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDBkY2RhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvTWFrZWZpbGUKQEAgLTAsMCArMSwyNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIE1hcnZlbGwgQ1BVIFBhY2tldCBIYW5kbGVyCisjCisKK2lmZXEgKCQoQ09ORklHX0FSQ0hfRkVST0NFT04pLHkpCisJaW5jbHVkZSAkKHNyY3RyZWUpLyQoTUFDSElORSkvY29uZmlnL212UnVsZXMubWsKK2VuZGlmCisKK2lmZGVmIENPTkZJR19NVl9IQUxfUlVMRVNfUEFUSAoraW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvY29uZmlnL2F1dG8uY29uZgoraW5jbHVkZSAkKHNyY3RyZWUpLyQoc3Vic3QgIiwsJChDT05GSUdfTVZfSEFMX1JVTEVTX1BBVEgpKQorZW5kaWYKKworQ1BIX09CSlMgKz0gbXZfY3BoX2FwaS5vIFwKKwkJbXZfY3BoX2FwcC5vIFwKKwkJbXZfY3BoX2RiLm8gXAorCQltdl9jcGhfZGV2Lm8gXAorCQltdl9jcGhfZmxvdy5vIFwKKwkJbXZfY3BoX2luZnJhLm8gXAorCQltdl9jcGhfbW9kLm8gXAorCQltdl9jcGhfbmV0ZGV2Lm8gXAorCQltdl9jcGhfc3lzZnMubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK212X2NwaC1vYmpzIDo9ICQoQ1BIX09CSlMpCitvYmotJChDT05GSUdfTVZfQ1BIKSArPSBtdl9jcGgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIzZmY3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfYXBpLmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgQVBJIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgVFBNIGNvbXBsZXggcHJvZmlsZSBJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwcm9maWxlX2lkICAgLSBUUE0gY29tcGxleCBwcm9maWxlIElECisqICAgICAgIGFjdGl2ZV9wb3J0ICAtIEFjdGl2ZSBXQU4gcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUgKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgcHJvZmlsZV9pZCwgTVZfQVBQX0dNQUNfUE9SVF9FIGFjdGl2ZV9wb3J0KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUocHJvZmlsZV9pZCwgYWN0aXZlX3BvcnQpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9zZXRfZmVhdHVyZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmUgc3VwcG9ydCBpbiBDUEggCisqCisqIElOUFVUUzoKKyogICAgICAgZmVhdHVyZSAtIENQSCBzdXBwb3J0ZWQgZmVhdHVyZXMKKyogICAgICAgc3RhdGUgICAtIEVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpbiBDUEgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9zZXRfZmVhdHVyZV9mbGFnIChDUEhfQVBQX0ZFQVRVUkVfRSBmZWF0dXJlLCBCT09MIHN0YXRlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWcoZmVhdHVyZSwgc3RhdGUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWciKTsKKyAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FkZF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FkZF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX2FkZF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9hZGRfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RlbF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RlbF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX2RlbF9ydWxlKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2RlbF9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfdXBkYXRlX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfdXBkYXRlX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfdXBkYXRlX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX3VwZGF0ZV9ydWxlIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZ2V0X2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZ2V0X2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAqZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9hcHBfZ2V0X3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfYXBwX2dldF9ydWxlXG4iKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hZGRfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2FkZF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2FkZF9ydWxlKGNwaF9mbG93KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfYWRkX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2RlbF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2RlbF9ydWxlKGNwaF9mbG93KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGVsX3J1bGUiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9nZXRfZmxvd19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgIFQtQ09OVCwgcXVldWUgYW5kIHBhY2tldCBtb2RpZmljYXRpb24gZm9yIFZJRCwgUC1iaXRzLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZ2V0X2Zsb3dfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdykKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoY3BoX2Zsb3cpOworICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfZmxvd19nZXRfcnVsZVxuIik7CisgICAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9jbGVhcl9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGFsbCBmbG93IG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfY2xlYXJfZmxvd19ydWxlKFZPSUQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2NsZWFyX3J1bGUoKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfY2xlYXJfcnVsZSIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2NsZWFyX2Zsb3dfcnVsZV9ieV9taCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgZmxvdyBtYXBwaW5nIHJ1bGVzIGJ5IE1ICisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAtICBNYXJ2ZWxsIGhlYWRlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2NsZWFyX2Zsb3dfcnVsZV9ieV9taChVSU5UMTYgbWgpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2NsZWFyX3J1bGVfYnlfbWgobWgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oIik7CisgICAgICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2Zsb3dfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgZHNjcF9tYXAgIC0gRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX3NldF9mbG93X2RzY3BfbWFwKENQSF9EU0NQX1BCSVRTX1QgKmRzY3BfbWFwKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZmxvd19zZXRfZHNjcF9tYXAoZHNjcF9tYXApOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgIkZhaWwgdG8gY2FsbCBjcGhfZmxvd19zZXRfZHNjcF9tYXAiKTsKKyAgICAgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZWxfZmxvd19kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGVsX2Zsb3dfZHNjcF9tYXAoVk9JRCkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2Zsb3dfZGVsX2RzY3BfbWFwKCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiRmFpbCB0byBjYWxsIGNwaF9mbG93X2RlbF9kc2NwX21hcCIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2dldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworYm9vbCBjcGhfZ2V0X3Rjb250X3N0YXRlKHVuc2lnbmVkIGludCB0Y29udCkKK3sKKyAgICByZXR1cm4gY3BoX2RiX2dldF90Y29udF9zdGF0ZSh0Y29udCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX3NldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jdXN0CisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKKyoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNwaF9zZXRfdGNvbnRfc3RhdGUodW5zaWduZWQgaW50IHRjb250LCBib29sIHN0YXRlKQoreworICAgIHJldHVybiBjcGhfZGJfc2V0X3Rjb250X3N0YXRlKHRjb250LCBzdGF0ZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUpOworRVhQT1JUX1NZTUJPTChjcGhfc2V0X2ZlYXR1cmVfZmxhZyk7CitFWFBPUlRfU1lNQk9MKGNwaF9hZGRfYXBwX3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfZGVsX2FwcF9ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX3VwZGF0ZV9hcHBfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9nZXRfYXBwX3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfYWRkX2Zsb3dfcnVsZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9kZWxfZmxvd19ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX2dldF9mbG93X3J1bGUpOworRVhQT1JUX1NZTUJPTChjcGhfY2xlYXJfZmxvd19ydWxlKTsKK0VYUE9SVF9TWU1CT0woY3BoX3NldF9mbG93X2RzY3BfbWFwKTsKK0VYUE9SVF9TWU1CT0woY3BoX2RlbF9mbG93X2RzY3BfbWFwKTsKK0VYUE9SVF9TWU1CT0woY3BoX2dldF90Y29udF9zdGF0ZSk7CitFWFBPUlRfU1lNQk9MKGNwaF9zZXRfdGNvbnRfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmZGI4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBpLmgKQEAgLTAsMCArMSw0MTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfYXBpLmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgQVBJIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0FQSV9IXworI2RlZmluZSBfTVZfQ1BIX0FQSV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFR5cGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgVFBNIGNvbXBsZXggcHJvZmlsZSBJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwcm9maWxlX2lkICAgLSBUUE0gY29tcGxleCBwcm9maWxlIElECisqICAgICAgIGFjdGl2ZV9wb3J0ICAtIEFjdGl2ZSBXQU4gcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX3NldF9jb21wbGV4X3Byb2ZpbGUgKHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgcHJvZmlsZV9pZCwgTVZfQVBQX0dNQUNfUE9SVF9FIGFjdGl2ZV9wb3J0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2ZlYXR1cmVfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBFbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlIHN1cHBvcnQgaW4gQ1BIIAorKgorKiBJTlBVVFM6CisqICAgICAgIGZlYXR1cmUgLSBDUEggc3VwcG9ydGVkIGZlYXR1cmVzCisqICAgICAgIHN0YXRlICAgLSBFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZlYXR1cmUgaW4gQ1BICisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X2ZlYXR1cmVfZmxhZyAoQ1BIX0FQUF9GRUFUVVJFX0UgZmVhdHVyZSwgQk9PTCBzdGF0ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FkZF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FkZF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGVsX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF91cGRhdGVfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF91cGRhdGVfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2dldF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2dldF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYWRkX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9hZGRfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIGZsb3cgbWFwcGluZyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9kZWxfZmxvd19ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZ2V0X2Zsb3dfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXRzIGZsb3cgbWFwcGluZyBydWxlIGZvciB0YWdnZWQgZnJhbWVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gSW5wdXQgdmlkLCBwYml0cywgZGlyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gb3V0cHV0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIAorKiAgICAgICAgICAgICAgICAgICBULUNPTlQsIHF1ZXVlIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cy4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2dldF9mbG93X3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9jbGVhcl9mbG93X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGFsbCBmbG93IG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfY2xlYXJfZmxvd19ydWxlKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9jbGVhcl9mbG93X3J1bGVfYnlfbWgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ2xlYXJzIGZsb3cgbWFwcGluZyBydWxlcyBieSBNSAorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgLSAgTWFydmVsbCBoZWFkZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9jbGVhcl9mbG93X3J1bGVfYnlfbWgoVUlOVDE2IG1oKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfc2V0X2Zsb3dfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0cyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgZHNjcF9tYXAgIC0gRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX3NldF9mbG93X2RzY3BfbWFwKENQSF9EU0NQX1BCSVRTX1QgKmRzY3BfbWFwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGVsX2Zsb3dfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2RlbF9mbG93X2RzY3BfbWFwKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9nZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Jvb2wgY3BoX2dldF90Y29udF9zdGF0ZSh1bnNpZ25lZCBpbnQgdGNvbnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9zZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3VzdAorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisqKgorKiogT1VUUFVUUzoKKyoqICAgTm9uZS4gCisqKgorKiogUkVUVVJOUzogICAgIAorKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCisqKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjcGhfc2V0X3Rjb250X3N0YXRlKHVuc2lnbmVkIGludCB0Y29udCwgYm9vbCBzdGF0ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX0FQSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2FwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjNzdmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmMKQEAgLTAsMCArMSwxNDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2FwcC5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGFwcGxpY2F0aW9uIG1vZHVsZSB0byBpbXBsZW1lbnQKKyogICAgICAgICAgICAgIENQSCBtYWluIGxvZ2ljIGFuZCBoYW5kbGUgYXBwbGljYXRpb24gcGFja2V0cyBzdWNoIGFzIE9NQ0ksIGVPQU0sIAorKiAgICAgICAgICAgICAgSUdNUCBwYWNrZXRzLgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDUEggZ2xvYmFsIHRyYWNlIGZsYWcgKi8KK1VJTlQzMiBnX2NwaF9nbG9iYWxfdHJhY2UgPSBDUEhfRVJSX0xFVkVMfENQSF9XQVJOX0xFVkVMfENQSF9JTkZPX0xFVkVMOworCitNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9wcm9maWxlX2lkW10gPQoreworICAgIHsgVFBNX1BPTl9XQU5fRFVBTF9NQUNfSU5UX1NXSVRDSCwgICJUUE1fUE9OX1dBTl9EVUFMX01BQ19JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX1dBTl9HMF9JTlRfU1dJVENILCAgICAgICAgIlRQTV9QT05fV0FOX0cwX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENILCAiVFBNX1BPTl9XQU5fRzFfTEFOX0cwX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSCwgICAgICAgICAiVFBNX0cwX1dBTl9HMV9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fRzFfV0FOX0cwX0lOVF9TV0lUQ0gsICAgICAgICAgIlRQTV9HMV9XQU5fRzBfSU5UX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9HMV9XQU5fRzBfSU5UX1NXSVRDSCwgICAgICJUUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENIIn0sCisgICAgeyBUUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENILCAgICAgIlRQTV9QT05fRzBfV0FOX0cxX0lOVF9TV0lUQ0gifSwKKyAgICB7IFRQTV9QT05fV0FOX0RVQUxfTUFDX0VYVF9TV0lUQ0gsICAiVFBNX1BPTl9XQU5fRFVBTF9NQUNfRVhUX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzFfTU5HX0VYVF9TV0lUQ0gsICAgICJUUE1fUE9OX1dBTl9HMV9NTkdfRVhUX1NXSVRDSCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzBfU0lOR0xFX1BPUlQsICAgICAgICJUUE1fUE9OX1dBTl9HMF9TSU5HTEVfUE9SVCJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzFfU0lOR0xFX1BPUlQsICAgICAgICJUUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVCJ9LAorICAgIHsgVFBNX1BPTl9HMV9XQU5fRzBfU0lOR0xFX1BPUlQsICAgICJUUE1fUE9OX0cxX1dBTl9HMF9TSU5HTEVfUE9SVCJ9LAorICAgIHsgVFBNX1BPTl9HMF9XQU5fRzFfU0lOR0xFX1BPUlQsICAgICJUUE1fUE9OX0cwX1dBTl9HMV9TSU5HTEVfUE9SVGcifSwKKyAgICB7IFRQTV9QT05fV0FOX0cwX0cxX0xQQkssICAgICAgICAgICAiVFBNX1BPTl9XQU5fRzBfRzFfTFBCSyJ9LAorICAgIHsgVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4sICAgICAgICJUUE1fUE9OX1dBTl9HMF9HMV9EVUFMX0xBTiJ9LCAgICAgCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9wcm9maWxlX2lkID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9wcm9maWxlX2lkKS9zaXplb2YoZ19lbnVtX21hcF9wcm9maWxlX2lkWzBdKSwKKyAgICBnX2VudW1fbWFwX3Byb2ZpbGVfaWQKK307CisKK3N0YXRpYyBNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9wb25fdHlwZVtdID0KK3sKKyAgICB7IENQSF9QT05fVFlQRV9FUE9OLCAiRVBPTiJ9LAorICAgIHsgQ1BIX1BPTl9UWVBFX0dQT04sICJHUE9OIn0sCisgICAgeyBDUEhfUE9OX1RZUEVfR0JFLCAgIkdCRSJ9LAorICAgIHsgQ1BIX1BPTl9UWVBFX1AyUCwgICJQMlAifSwKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X3Bvbl90eXBlID0KK3sKKyAgICBzaXplb2YoZ19lbnVtX21hcF9wb25fdHlwZSkvc2l6ZW9mKGdfZW51bV9tYXBfcG9uX3R5cGVbMF0pLAorICAgIGdfZW51bV9tYXBfcG9uX3R5cGUKK307CisKK3N0YXRpYyBNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9kaXJbXSA9Cit7CisgICAgeyBDUEhfRElSX1VTLCAgICAgICAiVVMifSwKKyAgICB7IENQSF9ESVJfRFMsICAgICAgICJEUyJ9LAorICAgIHsgQ1BIX0RJUl9OT1RfQ0FSRSwgIk5vdCBDYXJlIn0sCit9OworCitzdGF0aWMgTVZfRU5VTV9BUlJBWV9UIGdfZW51bV9hcnJheV9kaXIgPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX2Rpcikvc2l6ZW9mKGdfZW51bV9tYXBfZGlyWzBdKSwKKyAgICBnX2VudW1fbWFwX2RpcgorfTsKKworc3RhdGljIE1WX0VOVU1fRU5UUllfVCBnX2VudW1fbWFwX3J4X3R4W10gPQoreworICAgIHsgQ1BIX0RJUl9SWCwgICAgICAgICAiUlgifSwKKyAgICB7IENQSF9ESVJfVFgsICAgICAgICAgIlRYIn0sCisgICAgeyBDUEhfUlhfVFhfTk9UX0NBUkUsICJOb3QgQ2FyZSJ9LAorfTsKKworc3RhdGljIE1WX0VOVU1fQVJSQVlfVCBnX2VudW1fYXJyYXlfcnhfdHggPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX3J4X3R4KS9zaXplb2YoZ19lbnVtX21hcF9yeF90eFswXSksCisgICAgZ19lbnVtX21hcF9yeF90eAorfTsKKworc3RhdGljIE1WX0VOVU1fRU5UUllfVCBnX2VudW1fbWFwX2dtYWNbXSA9Cit7CisgICAgeyBNVl9BUFBfR01BQ19QT1JUXzAsICAiR01BQzAifSwKKyAgICB7IE1WX0FQUF9HTUFDX1BPUlRfMSwgICJHTUFDMSJ9LAorICAgIHsgTVZfQVBQX1BPTl9NQUNfUE9SVCwgIlBPTiBNQUMifSwKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X2dtYWMgPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX2dtYWMpL3NpemVvZihnX2VudW1fbWFwX2dtYWNbMF0pLAorICAgIGdfZW51bV9tYXBfZ21hYworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFeHRlcm5hbCBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBDSEFSICpjcGhfbG9va3VwX2VudW1fc3RyKE1WX0VOVU1fQVJSQVlfVCAqcF9lbnVtX2FycmF5LCBJTlQzMiBlbnVtX3ZhbHVlKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgcHJvZmlsZV9pZCAgIC0gVFBNIGNvbXBsZXggcHJvZmlsZSBJRAorKiAgICAgICBhY3RpdmVfcG9ydCAgLSBBY3RpdmUgV0FOIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZSAodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCBwcm9maWxlX2lkLCBNVl9BUFBfR01BQ19QT1JUX0UgYWN0aXZlX3BvcnQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgcHJvZmlsZV9pZCAqLworICAgIGlmIChwcm9maWxlX2lkID4gVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInByb2ZpbGVfaWRbJWRdIGlzIG91dCBvZiByYW5nZVsxfiVkXSBcbiIsIHByb2ZpbGVfaWQsIFRQTV9QT05fV0FOX0cwX0cxX0RVQUxfTEFOKTsKKyAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayB0aGUgcmFuZ2Ugb2YgYWN0aXZlX3BvcnQgKi8KKyAgICBpZiAoYWN0aXZlX3BvcnQgPiBNVl9BUFBfUE9OX01BQ19QT1JUKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJhY3RpdmVfcG9ydFslZF0gaXMgb3V0IG9mIHJhbmdlWzB+JWRdIFxuIiwgYWN0aXZlX3BvcnQsIE1WX0FQUF9QT05fTUFDX1BPUlQpOworICAgICAgICByZXR1cm4gTVZfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIHJjID0gY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fUFJPRklMRV9JRCwgJnByb2ZpbGVfaWQpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfc2V0X3BhcmFtIik7CisKKyAgICByYyA9IGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JULCAmYWN0aXZlX3BvcnQpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfc2V0X3BhcmFtIik7CisgICAKKyAgICByZXR1cm4gcmM7ICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBFbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlIHN1cHBvcnQgaW4gQ1BIIAorKgorKiBJTlBVVFM6CisqICAgICAgIGZlYXR1cmUgLSBDUEggc3VwcG9ydGVkIGZlYXR1cmVzCisqICAgICAgIHN0YXRlICAgLSBFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZlYXR1cmUgaW4gQ1BICisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWcgKENQSF9BUFBfRkVBVFVSRV9FIGZlYXR1cmUsIEJPT0wgc3RhdGUpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICBzd2l0Y2ggKGZlYXR1cmUpCisgICAgeworICAgICAgICBjYXNlIENQSF9BUFBfRkVBVFVSRV9BUFA6CisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX0FQUF9GRUFUVVJFX0lHTVA6CisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQsJnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9BUFBfRkVBVFVSRV9CQzoKKyAgICAgICAgICAgIGNwaF9kYl9zZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQsICAmc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0FQUF9GRUFUVVJFX0ZMT1c6CisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9GTE9XX1NVUFBPUlQsJnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9BUFBfRkVBVFVSRV9VRFA6CisgICAgICAgICAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9VRFBfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSB0aGUgcGFyc2luZyBmaWxlZCBvZiBDUEggcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfdmFsaWRhdGVfcGFyc2VfZmllbGQgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgLyogQ2hlY2sgdGhlIHJhbmdlIG9mIHBhcnNlX2JtICovCisgICAgaWYgKHBhcnNlX2JtID49IENQSF9BUFBfUEFSU0VfRklFTERfRU5EKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSBpcyBvdXQgb2YgcmFuZ2VbMHgwMX4weCV4XSBcbiIsIHBhcnNlX2JtLCBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VORCk7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgZGlyZWN0aW9uICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpCisgICAgeworICAgICAgICBpZiAocGFyc2Vfa2V5LT5kaXIgPiBDUEhfRElSX05PVF9DQVJFKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgb3V0IG9mIHJhbmdlWzB+JWRdIFxuIiwgcGFyc2Vfa2V5LT5kaXIsIENQSF9ESVJfTk9UX0NBUkUpOworICAgICAgICAgICAgcmV0dXJuIE1WX09VVF9PRl9SQU5HRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFZhbGlkYXRlIFJYL1RYIGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpCisgICAgeworICAgICAgICBpZiAocGFyc2Vfa2V5LT5yeF90eCA+IENQSF9SWF9UWF9OT1RfQ0FSRSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJyeF90eFslZF0gaXMgb3V0IG9mIHJhbmdlWzB+JWRdIFxuIiwgcGFyc2Vfa2V5LT5yeF90eCwgQ1BIX1JYX1RYX05PVF9DQVJFKTsKKyAgICAgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICB9ICAgIAorCisgICAgLyogQ291bGQgbm90IHBhcnNlIE5vbmUgSVB2NCBFdGggdHlwZSBhbmQgSVB2NCBwcm90b2NvbCB0eXBlIGF0IHRoZSBzYW1lIGltZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFKSAmJgorICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkgJiYKKyAgICAgICAgKHBhcnNlX2tleS0+ZXRoX3R5cGUgIT0gTVZfQ1BIX0VUSF9UWVBFX0lQVjQpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgZXRoX3R5cGVbMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgcGFyc2luZyBOb25lIElQdjQgRXRoIHR5cGUgYW5kIElQdjQgcHJvdG9jb2wgdHlwZSBhdCB0aGUgc2FtZSB0aW1lXG4iLAorICAgICAgICAgICAgICAgICAgICAgcGFyc2VfYm0sIHBhcnNlX2tleS0+ZXRoX3R5cGUpOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8qIENvdWxkIG5vdCBwYXJzZSBOb25lIElQdjYgRXRoIHR5cGUgYW5kIElQdjQgcHJvdG9jb2wgdHlwZSBhdCB0aGUgc2FtZSBpbWUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkgJiYKKyAgICAgICAgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpIHx8CisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKSB8fCAKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpKSAmJgorICAgICAgICAocGFyc2Vfa2V5LT5ldGhfdHlwZSAhPSBNVl9DUEhfRVRIX1RZUEVfSVBWNikpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBldGhfdHlwZVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBwYXJzaW5nIE5vbmUgSVB2NiBFdGggdHlwZSBhbmQgSVB2NiBOSCBvciBJQ01QIHR5cGUgYXQgdGhlIHNhbWUgdGltZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2JtLCBwYXJzZV9rZXktPmV0aF90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9ICAgIAorCisgICAgLyogQ291bGQgbm90IHBhcnNlIEV0aCBzdWJ0eXBlIGFuZCBJUHY0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICBpZiAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkgJiYKKyAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBwYXJzaW5nIEV0aCBzdWJ0eXBlIGFuZCBJUHY0IHR5cGUgYXQgdGhlIHNhbWUgdGltZSBcbiIsIHBhcnNlX2JtKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvKiBDb3VsZCBub3QgcGFyc2UgRXRoIHN1YnR5cGUgYW5kIElQdjYgdGhlIHNhbWUgdGltZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFKSAmJgorICAgICAgICAoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkgfHwKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpIHx8IAorICAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkpKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJwYXJzZV9ibVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBwYXJzaW5nIEV0aCBzdWJ0eXBlIGFuZCBJUHY2IHR5cGUgYXQgdGhlIHNhbWUgdGltZSBcbiIsIHBhcnNlX2JtKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9ICAgIAorCisgICAgLyogQ291bGQgbm90IHBhcnNlIElQdjQgYW5kIElQdjYgYXQgdGhlIHNhbWUgdGltZSAqLworICAgIGlmICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkgJiYKKyAgICAgICAgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpIHx8CisgICAgICAgICAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKSB8fCAKKyAgICAgICAgIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpKSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGFyc2VfYm1bMHgleF0sIGRvZXMgbm90IHN1cHBvcnQgcGFyc2luZyBJUHY0IGFuZCBJUHY2IHR5cGUgYXQgdGhlIHNhbWUgdGltZVxuIiwgcGFyc2VfYm0pOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8qIFZhbGlkYXRlIElHTVB2NiB0eXBlICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpICYmCisgICAgICAgIChwYXJzZV9rZXktPmljbXB2Nl90eXBlICE9IE1WX0lDTVBWNl9UWVBFX01MRCkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInBhcnNlX2JtWzB4JXhdLCBpY21wdjZfdHlwZVslZF0sIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgSUNNUHY2IE1MRCB0eXBlWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcnNlX2JtLCBwYXJzZV9rZXktPmljbXB2Nl90eXBlLCBNVl9JQ01QVjZfVFlQRV9NTEQpOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0gICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfdmFsaWRhdGVfbW9kX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFZhbGlkYXRlIHRoZSBtb2RpZmljYXRpb24gZmlsZWQgb2YgQ1BIIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3ZhbGlkYXRlX21vZF9maWVsZCAoCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgLyogQ2hlY2sgdGhlIHJhbmdlIG9mIG1vZF9ibSAqLworICAgIGlmIChtb2RfYm0gPj0gQ1BIX0FQUF9NT0RfRklFTERfRU5EKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJtb2RfYm1bMHgleF0gaXMgb3V0IG9mIHJhbmdlWzB4MDF+MHgleF0gXG4iLCBtb2RfYm0sIENQSF9BUFBfTU9EX0ZJRUxEX0VORCk7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgLyogRG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgR01BQyBpbmZvcm1hdGlvbiBhbmQgc3RyaXAgTUggYXQgdGhlIHNhbWUgdGltZSAqLworICAgIGlmICgobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfQUREX0dNQUMpICYmCisgICAgICAgIChtb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9TVFJJUF9NSCkpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIm1vZF9ibVsweCV4XSwgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgR01BQyBpbmZvcm1hdGlvbiBhbmQgc3RyaXBwaW5nIE1IIGF0IHRoZSBzYW1lIHRpbWUgXG4iLCBtb2RfYm0pOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3ZhbGlkYXRlX2Zyd2RfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVmFsaWRhdGUgdGhlIGZvcndhcmRpbmcgZmlsZWQgb2YgQ1BIIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfdmFsaWRhdGVfZnJ3ZF9maWVsZCAoCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgLyogQ2hlY2sgdGhlIHJhbmdlIG9mIGZyd2RfYm0gKi8KKyAgICBpZiAoZnJ3ZF9ibSA+PSBDUEhfQVBQX0ZSV0RfRklFTERfRU5EKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJmcndkX2JtWzB4JXhdIGlzIG91dCBvZiByYW5nZVsweDAxfjB4JXhdIFxuIiwgZnJ3ZF9ibSwgQ1BIX0FQUF9GUldEX0ZJRUxEX0VORCk7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfYWRkX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfYWRkX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZChwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIHBhcnNpbmcgZmllbGQiKTsKKyAgICAKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfbW9kX2ZpZWxkKG1vZF9ibSwgbW9kX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIG1vZGlmaWNhdGlvbiBmaWVsZCIpOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX2Zyd2RfZmllbGQoZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBmb3J3YXJkaW5nIGZpZWxkIik7CisKKyAgICByYyA9IGNwaF9kYl9hZGRfYXBwX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfYWRkX2FwcF9ydWxlIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9kZWxfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgcGFyc2luZyBmaWVsZCIpOworICAgIAorICAgIHJjID0gY3BoX2RiX2RlbF9hcHBfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2RlbF9hcHBfcnVsZSIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfdXBkYXRlX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVXBkYXRlIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfdXBkYXRlX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHJjID0gY3BoX2FwcF92YWxpZGF0ZV9wYXJzZV9maWVsZChwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIHBhcnNpbmcgZmllbGQiKTsKKyAgICAKKyAgICByYyA9IGNwaF9hcHBfdmFsaWRhdGVfbW9kX2ZpZWxkKG1vZF9ibSwgbW9kX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIHZhbGlkIG1vZGlmaWNhdGlvbiBmaWVsZCIpOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX2Zyd2RfZmllbGQoZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byB2YWxpZCBmb3J3YXJkaW5nIGZpZWxkIik7CisKKyAgICByYyA9IGNwaF9kYl91cGRhdGVfYXBwX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSwgbW9kX2JtLCBtb2RfdmFsdWUsIGZyd2RfYm0sIGZyd2RfdmFsdWUpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9nZXRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9nZXRfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgcGFyc2luZyBmaWVsZCIpOworICAgIAorICAgIHJjID0gY3BoX2RiX2dldF9hcHBfcnVsZShwYXJzZV9ibSwgcGFyc2Vfa2V5LCBtb2RfYm0sIG1vZF92YWx1ZSwgZnJ3ZF9ibSwgZnJ3ZF92YWx1ZSk7CisgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiZmFpbCB0byBjYWxsIGNwaF9hcHBfZ2V0X3J1bGVcbiIpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggcnVsZSBhY2NvcmRpbmcgdG8gcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZ2V0X3J1bGVfYnlfZGlyX3Byb3RvICgKKyAgICBDUEhfRElSX0UgICAgICAgICAgICAgIGRpciwKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgIHByb3RvX3R5cGUsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FICpwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgKm1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgKmZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90byhkaXIsIHByb3RvX3R5cGUsIHBhcnNlX2JtLCBwYXJzZV9rZXksIG1vZF9ibSwgbW9kX3ZhbHVlLCBmcndkX2JtLCBmcndkX3ZhbHVlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2dldF9hcHBfcnVsZV9ieV9kaXJfcHJvdG8iKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5jcmVhc2UgUlggY291bnRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlciAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfYXBwX3ZhbGlkYXRlX3BhcnNlX2ZpZWxkKHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gdmFsaWQgcGFyc2luZyBmaWVsZCIpOworICAgIAorICAgIHJjID0gY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90bygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiAgSW5jcmVhc2UgUlggY291bnRlciBhY2NvcmRpbmcgdG8gcHJvdG9jb2wgdHlwZQorKgorKiBJTlBVVFM6CisqICAgICAgIGRpciAgICAgICAgLSBEaXJlY3Rpb24KKyogICAgICAgcHJvdG9fdHlwZSAtIFNLQiBwcm90b2NvbCB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvICgKKyAgICBDUEhfRElSX0UgZGlyLAorICAgIFVJTlQxNiAgICBwcm90b190eXBlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgcmMgPSBjcGhfZGJfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oZGlyLCBwcm90b190eXBlKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IEdFTUFDIHBvcnQgdHlwZSBieSBwcm9maWxlIElECisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgcG9ydF90eXBlICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSAoCisgICAgQ1BIX1BPUlRfU1RBVEVfVCAgICAgICAgICAqcG9ydF90eXBlKQoreworICAgIHRwbV9ldGhfY29tcGxleF9wcm9maWxlX3QgIHByb2ZpbGVfaWQgID0gMDsKKyAgICBNVl9BUFBfR01BQ19QT1JUX0UgICAgICAgICBhY3RpdmVfcG9ydCA9IDA7CisgICAgTVZfU1RBVFVTICAgICAgICAgICAgICAgICAgcmMgICAgICAgICAgPSBNVl9PSzsKKworICAgIC8qIEdldCBQcm9maWxlIElEIGFuZCBhY3RpdmUgV0FOIHBvcnQgKi8KKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9QUk9GSUxFX0lELCAgJnByb2ZpbGVfaWQpOworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JULCAmYWN0aXZlX3BvcnQpOworCisgICAgc3dpdGNoIChwcm9maWxlX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9EVUFMX01BQ19JTlRfU1dJVENIOgorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cxX0xBTl9HMF9JTlRfU1dJVENIOiAgICAgICAgICAgIAorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0RVQUxfTUFDX0VYVF9TV0lUQ0g6ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU46ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF90eXBlICA9IE1WX0FQUF9QT1JUX1dBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMF9JTlRfU1dJVENIOgorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cwX1NJTkdMRV9QT1JUOiAgICAgICAgICAgIAorICAgICAgICBjYXNlIFRQTV9QT05fV0FOX0cwX0cxX0xQQks6ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5WQUxJRDsgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3R5cGUgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRQTV9HMF9XQU5fRzFfSU5UX1NXSVRDSDoKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfV0FOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfdHlwZSAgID0gTVZfQVBQX1BPUlRfTEFOOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0FDVElWRTsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9JTlZBTElEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFBNX0cxX1dBTl9HMF9JTlRfU1dJVENIOgorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fUE9OX0cxX1dBTl9HMF9JTlRfU1dJVENIOgorICAgICAgICBjYXNlIFRQTV9QT05fRzFfV0FOX0cwX1NJTkdMRV9QT1JUOiAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF90eXBlICA9IE1WX0FQUF9QT1JUX1dBTjsKKworICAgICAgICAgICAgaWYgKGFjdGl2ZV9wb3J0ID09IE1WX0FQUF9HTUFDX1BPUlRfMSkgeworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0lOQUNUSVZFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOQUNUSVZFOworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fUE9OX0cwX1dBTl9HMV9JTlRfU1dJVENIOgorICAgICAgICBjYXNlIFRQTV9QT05fRzBfV0FOX0cxX1NJTkdMRV9QT1JUOiAgICAgICAgICAgIAorICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3R5cGUgICA9IE1WX0FQUF9QT1JUX0xBTjsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7ICAgICAgICAgICAgCisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF90eXBlICA9IE1WX0FQUF9QT1JUX1dBTjsKKworICAgICAgICAgICAgaWYgKGFjdGl2ZV9wb3J0ID09IE1WX0FQUF9HTUFDX1BPUlRfMCkgeworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0lOQUNUSVZFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMF0ucG9ydF9zdGF0ZSAgPSBNVl9HRV9QT1JUX0lOQUNUSVZFOworICAgICAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfUE9OX01BQ19QT1JUXS5wb3J0X3N0YXRlID0gTVZfR0VfUE9SVF9BQ1RJVkU7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMV9NTkdfRVhUX1NXSVRDSDoKKyAgICAgICAgY2FzZSBUUE1fUE9OX1dBTl9HMV9TSU5HTEVfUE9SVDogICAgICAgICAgICAKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzBdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTlZBTElEOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfMV0ucG9ydF90eXBlICAgPSBNVl9BUFBfUE9SVF9MQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8xXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfdHlwZSAgPSBNVl9BUFBfUE9SVF9XQU47CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX1BPTl9NQUNfUE9SVF0ucG9ydF9zdGF0ZSA9IE1WX0dFX1BPUlRfQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwb3J0X3R5cGVbTVZfQVBQX0dNQUNfUE9SVF8wXS5wb3J0X3N0YXRlICA9IE1WX0dFX1BPUlRfSU5WQUxJRDsKKyAgICAgICAgICAgIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUXzFdLnBvcnRfc3RhdGUgID0gTVZfR0VfUE9SVF9JTlZBTElEOworICAgICAgICAgICAgcG9ydF90eXBlW01WX0FQUF9QT05fTUFDX1BPUlRdLnBvcnRfc3RhdGUgPSBNVl9HRV9QT1JUX0lOVkFMSUQ7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IHBlZXIgR0VNQUMgcG9ydAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgIC0gT3JpZ2luYWwgcG9ydAorKgorKiBPVVRQVVRTOgorKiAgICAgICBwZWVyX3BvcnQgICAtIFBlZXIgcG9ydAorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9wYXJzZV9wZWVyX3BvcnQgKAorICAgIElOVDMyICAgIHBvcnQsCisgICAgSU5UMzIgICAqcGVlcl9wb3J0KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCA9IDA7CisgICAgQ1BIX1BPUlRfU1RBVEVfVCAgcG9ydF90eXBlW01WX0FQUF9HTUFDX1BPUlRfTlVNXTsKKyAgICBNVl9TVEFUVVMgICAgICAgICByYyAgPSBNVl9GQUlMOworCisgICAgLyogVmVyaWZ5IHBvcnQgKi8KKyAgICBpZiAocG9ydCA+IE1WX0FQUF9QT05fTUFDX1BPUlQgKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicG9ydFslZF0gaXMgb3V0IG9mIHJhbmdlWzB+JWRdIFxuIiwgcG9ydCwgTVZfQVBQX1BPTl9NQUNfUE9SVCk7CisgICAgICAgIHJldHVybiBNVl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgIAorICAgIC8qIEdldCBwb3J0IHR5cGUgKi8KKyAgICByYyA9IGNwaF9hcHBfcGFyc2VfZ2VfcG9ydF90eXBlKCZwb3J0X3R5cGVbMF0pOworCisgICAgLyogU2VhcmNoIGZvciBwZWVyIHBvcnQgKi8KKyAgICBpZiAocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSA9PSBNVl9BUFBfUE9SVF9MQU4pCisgICAgeworICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1WX0FQUF9HTUFDX1BPUlRfTlVNOyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlkeCA9PSBwb3J0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKChwb3J0X3R5cGVbaWR4XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX1dBTikgJiYKKyAgICAgICAgICAgICAgICAocG9ydF90eXBlW2lkeF0ucG9ydF9zdGF0ZSA9PSBNVl9HRV9QT1JUX0FDVElWRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBlZXJfcG9ydCA9IGlkeDsKKyAgICAgICAgICAgICAgICByYyAgPSBNVl9PSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlID09IE1WX0FQUF9QT1JUX1dBTikKKyAgICB7CisgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1WX0FQUF9HTUFDX1BPUlRfTlVNOyBpZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlkeCA9PSBwb3J0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHBvcnRfdHlwZVtpZHhdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfTEFOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwZWVyX3BvcnQgPSBpZHg7CisgICAgICAgICAgICAgICAgcmMgID0gTVZfT0s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9kaXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgYXBwbGljYXRpb24gcGFja2V0IHRvIG91dHB1dCBwYXJzZSBiaXRtYXAgYW5kIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgLSBHRSBNQUMgcG9ydAorKiAgICAgICByeCAgICAtIFdoZXRoZXIgUlggcGF0aAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBSZXR1cm4gZGlyZWN0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NQSF9ESVJfRSBjcGhfYXBwX3BhcnNlX2RpciAoCisgICAgSU5UMzIgICAgcG9ydCwKKyAgICBCT09MICAgICByeCkKK3sKKyAgICBDUEhfUE9SVF9TVEFURV9UIHBvcnRfdHlwZVtNVl9BUFBfR01BQ19QT1JUX05VTV07CisgICAgTVZfU1RBVFVTICAgICAgICByYyAgPSBNVl9PSzsKKyAgICBDUEhfRElSX0UgICAgICAgIGRpciA9IENQSF9ESVJfSU5WQUxJRDsKKworICAgIC8qIFBhcnNlIHBvcnQgKi8KKyAgICBpZiAocG9ydCA+IE1WX0FQUF9QT05fTUFDX1BPUlQgKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicG9ydFslZF0gaXMgb3V0IG9mIHJhbmdlWzB+JWRdIFxuIiwgcG9ydCwgTVZfQVBQX1BPTl9NQUNfUE9SVCk7CisgICAgICAgIHJldHVybiBkaXI7CisgICAgfQorCisgICAgLyogR2V0IEdNQUMgV0FOL0xBTiB0eXBlICovCisgICAgcmMgPSBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSgmcG9ydF90eXBlWzBdKTsKKyAgICBpZiAocmMgIT0gTVZfT0spCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSgpIFxuIik7CisgICAgICAgIHJldHVybiBkaXI7CisgICAgfQorCisgICAgLyogUnggZGlyICovCisgICAgaWYgKHJ4ID09IFRSVUUpCisgICAgeworICAgICAgICBpZiAoKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX1dBTikgJiYKKyAgICAgICAgICAgIChwb3J0X3R5cGVbcG9ydF0ucG9ydF9zdGF0ZSA9PSBNVl9HRV9QT1JUX0FDVElWRSkpCisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX0RTOworICAgICAgICBlbHNlIGlmICgocG9ydF90eXBlW3BvcnRdLnBvcnRfdHlwZSAgPT0gTVZfQVBQX1BPUlRfTEFOKSAmJgorICAgICAgICAgICAgICAgICAocG9ydF90eXBlW3BvcnRdLnBvcnRfc3RhdGUgPT0gTVZfR0VfUE9SVF9BQ1RJVkUpKQorICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9VUzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSBDUEhfRElSX0lOVkFMSUQ7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImRpclslZF0gaXMgaW52YWxpZCBcbiIsIGRpcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogVHggZGlyICovCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChwb3J0X3R5cGVbcG9ydF0ucG9ydF90eXBlICA9PSBNVl9BUFBfUE9SVF9XQU4pICYmCisgICAgICAgICAgICAocG9ydF90eXBlW3BvcnRdLnBvcnRfc3RhdGUgPT0gTVZfR0VfUE9SVF9BQ1RJVkUpKQorICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9VUzsKKyAgICAgICAgZWxzZSBpZiAoKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3R5cGUgID09IE1WX0FQUF9QT1JUX0xBTikgJiYKKyAgICAgICAgICAgICAgICAgKHBvcnRfdHlwZVtwb3J0XS5wb3J0X3N0YXRlID09IE1WX0dFX1BPUlRfQUNUSVZFKSkKKyAgICAgICAgICAgIGRpciA9IENQSF9ESVJfRFM7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGlyID0gQ1BIX0RJUl9JTlZBTElEOworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJkaXJbJWRdIGlzIGludmFsaWQgXG4iLCBkaXIpOworICAgICAgICB9ICAgIAorICAgIH0KKworICAgIHJldHVybiBkaXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUGFyc2UgYXBwbGljYXRpb24gcGFja2V0IHRvIG91dHB1dCBwYXJzZSBiaXRtYXAgYW5kIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAtIEdFIE1BQyBwb3J0CisqICAgICAgIHNrYl9kYXRhICAgLSBQb2ludGVyIHRvIFNLQiBkYXRhIGhvbGRpbmcgYXBwbGljYXRpb24gcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfcGFyc2VfcGFja2V0ICgKKyAgICBJTlQzMiAgICAgICAgICAgICAgICAgIHBvcnQsCisgICAgVUlOVDggICAgICAgICAgICAgICAgICpza2JfZGF0YSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBVSU5UMTYgICAgICAgICAgICAgICAgICBldGhfdHlwZSAgICAgPSAwOworICAgIHN0cnVjdCBpcHY2aGRyICAgICAgICAgKnBfaXB2Nl9oZHIgICA9IE5VTEw7CisgICAgc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqcF9ob3BvcHRfaGRyID0gTlVMTDsKKyAgICBzdHJ1Y3QgaWNtcDZoZHIgICAgICAgICpwX2ljbXBfaGRyICAgPSBOVUxMOyAgICAKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgICpwX2ZpZWxkICAgICAgPSBOVUxMOworICAgIE1WX1NUQVRVUyAgICAgICAgICAgICAgIHJjICAgICAgICAgICA9IE1WX09LOworCisgICAgKnBhcnNlX2JtID0gMDsKKyAgICBtZW1zZXQocGFyc2Vfa2V5LCAwLCBzaXplb2YoQ1BIX0FQUF9QQVJTRV9UKSk7CisKKyAgICAvKiBQYXJzZSBkaXIgKi8KKyAgICBwYXJzZV9rZXktPmRpciA9IGNwaF9hcHBfcGFyc2VfZGlyKHBvcnQsIFRSVUUpOworICAgIGlmKHBhcnNlX2tleS0+ZGlyID09IENQSF9ESVJfSU5WQUxJRCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBpbnZhbGlkIFxuIiwgcGFyc2Vfa2V5LT5kaXIpOworICAgICAgICByZXR1cm4gTVZfQkFEX1ZBTFVFOworICAgIH0KKyAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVI7CisKKyAgICAvKiBQYXJzZSBSWC9UWCAqLworICAgIHBhcnNlX2tleS0+cnhfdHggPSBDUEhfRElSX1JYOworICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYOworICAgIAorICAgIC8qIFBhcnNlIE1hcnZlbGwgaGVhZGVyICovCisgICAgaWYgKHBhcnNlX2tleS0+ZGlyID09IENQSF9ESVJfVVMpCisgICAgICAgIHBhcnNlX2tleS0+bWggPSAobnRvaHMoKihVSU5UMTYgKilza2JfZGF0YSkgJiBNVl9WQUxJRF9NSF9NQVNLKTsKKyAgICBlbHNlCisgICAgICAgIHBhcnNlX2tleS0+bWggPSAobnRvaHMoKihVSU5UMTYgKilza2JfZGF0YSkgJiBNVl9WQUxJRF9HSF9NQVNLKTsKKyAgICAqcGFyc2VfYm0gICAgfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9NSDsKKyAgICAKKyAgICAvKiBQYXJzZSBFdGggdHlwZSAqLworICAgIHBfZmllbGQgID0gc2tiX2RhdGEgKyBNVl9FVEhfTUhfU0laRSArIEVUSF9BTEVOICsgRVRIX0FMRU47CisgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgIHdoaWxlIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgeworICAgICAgICBwX2ZpZWxkICs9IFZMQU5fSExFTjsKKyAgICAgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgIH0KKyAgICBwYXJzZV9rZXktPmV0aF90eXBlID0gZXRoX3R5cGU7CisgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEU7CisKKyAgICAvKiBQYXJzZSBJUHY0IHR5cGUgKi8KKyAgICBpZiAoZXRoX3R5cGUgPT0gRVRIX1BfSVApIHsKKyAgICAgICAgcF9maWVsZCArPSBNVl9DUEhfRVRIX1RZUEVfTEVOOworICAgICAgICBwX2ZpZWxkICs9IE1WX0lQVjRfUFJPVE9fT0ZGU0VUOworICAgICAgICBwYXJzZV9rZXktPmlwdjRfdHlwZSA9ICooVUlOVDggKilwX2ZpZWxkOworICAgICAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEU7CisgICAgfQorICAgIC8qIFBhcnNlIElQdjYgdHlwZSAqLworICAgIGVsc2UgaWYgKGV0aF90eXBlID09IEVUSF9QX0lQVjYpIHsKKyAgICAgICAgCisgICAgICAgIHBfaXB2Nl9oZHIgPSAoc3RydWN0IGlwdjZoZHIgKikocF9maWVsZCArIE1WX0NQSF9FVEhfVFlQRV9MRU4pOworICAgICAgICBwYXJzZV9rZXktPmlwdjZfbmgxID0gcF9pcHY2X2hkci0+bmV4dGhkcjsKKyAgICAgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDE7CisKKyAgICAgICAgaWYgKHBfaXB2Nl9oZHItPm5leHRoZHIgIT0gTkVYVEhEUl9IT1ApCisgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgIHBfaG9wb3B0X2hkciA9IChzdHJ1Y3QgaXB2Nl9ob3BvcHRfaGRyICopKChVSU5UOCAqKXBfaXB2Nl9oZHIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKworICAgICAgICBwYXJzZV9rZXktPmlwdjZfbmgyID0gcF9ob3BvcHRfaGRyLT5uZXh0aGRyOworICAgICAgICAqcGFyc2VfYm0gfD0gQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMjsKKworICAgICAgICBpZiAocF9ob3BvcHRfaGRyLT5uZXh0aGRyICE9IElQUFJPVE9fSUNNUFY2KQorICAgICAgICAgICAgcmV0dXJuIHJjOworCisgICAgICAgIHBfaWNtcF9oZHIgPSAgKHN0cnVjdCBpY21wNmhkciAqKSgoVUlOVDggKilwX2hvcG9wdF9oZHIgKyBpcHY2X29wdGxlbihwX2hvcG9wdF9oZHIpKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAocF9pY21wX2hkci0+aWNtcDZfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1FVRVJZOgorICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFUE9SVDoKKyAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9SRURVQ1RJT046CisgICAgICAgICAgICBjYXNlIElDTVBWNl9NTEQyX1JFUE9SVDoKKyAgICAgICAgICAgICAgICBwYXJzZV9rZXktPmljbXB2Nl90eXBlID0gTVZfSUNNUFY2X1RZUEVfTUxEOworICAgICAgICAgICAgICAgICpwYXJzZV9ibSB8PSBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorICAgIC8qIFBhcnNlIEV0aGVuZXQgc3VidHlwZSAqLworICAgIGVsc2UgeworICAgICAgICBwYXJzZV9rZXktPmV0aF9zdWJ0eXBlID0gKCooVUlOVDggKikocF9maWVsZCArIE1WX0NQSF9FVEhfVFlQRV9MRU4pKTsKKyAgICAgICAgKnBhcnNlX2JtIHw9IENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEU7CisgICAgfQorICAgIAorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX21vZF9yeF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IFJYIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHJ4X2Rlc2MgICAtIFJYIGRlc2NyaXB0b3IKKyogICAgICAgbW9kX2JtICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgLSBNb2RpZmljYXRpb24gdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfbW9kX3J4X3BhY2tldCAoICAKKyAgICBJTlQzMiAgICAgICAgICAgICAgICBwb3J0LAorICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiwKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICpza2IsCisgICAgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYywKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgKm1vZF92YWx1ZSkKK3sKKyAgICBVSU5UOCAgICAgKnBfZGF0YSA9IE5VTEw7CisgICAgTVZfU1RBVFVTICByYyAgICAgPSBNVl9PSzsKKworICAgIC8qIFNhdmUgR01BQyBJbmZvcm1hdGlvbiAqLyAgICAKKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfQUREX0dNQUMpCisgICAgeworICAgICAgICBwX2RhdGEgICAgID0gKFVJTlQ4ICopc2tiLT5kYXRhOworICAgICAgICBwX2RhdGFbMF0gJj0gMHgwRjsKKyAgICAgICAgcF9kYXRhWzBdIHw9ICgocG9ydCAmIDB4MEYpIDw8IDQpOworICAgIH0KKworICAgIC8qIFJlcGxhY2UgcHJvdG9jb2wgdHlwZSAqLworICAgIHNrYi0+dGFpbCAgICArPSByeF9kZXNjLT5kYXRhU2l6ZTsKKyAgICBza2ItPmxlbiAgICAgID0gcnhfZGVzYy0+ZGF0YVNpemU7CisKKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfU1RSSVBfTUgpCisgICAgeworCisgICAgICAgIHNrYi0+ZGF0YSArPSBNVl9FVEhfTUhfU0laRTsKKyAgICAgICAgc2tiLT50YWlsIC09IE1WX0VUSF9NSF9TSVpFOworICAgICAgICBza2ItPmxlbiAgLT0gTVZfRVRIX01IX1NJWkU7CisgICAgfSAKKyAgICAKKyAgICBza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworICAgIGlmIChtb2RfYm0gJiBDUEhfQVBQX1JYX01PRF9SRVBMQUNFX1BST1RPX1RZUEUpCisgICAgeworICAgICAgICBza2ItPnByb3RvY29sID0gbW9kX3ZhbHVlLT5wcm90b190eXBlOworICAgIH0gICAgCisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9tb2RfdHhfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBUWCBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogSU5QVVRTOgorKiAgICAgICBza2IgICAgICAgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9kaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyogICAgICAgbW9kX2JtICAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX21vZF90eF9wYWNrZXQgKAorICAgIHN0cnVjdCBza19idWZmICAgICAgICAqc2tiLAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQsCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICAqbW9kX3ZhbHVlKQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgaWYgKG1vZF9ibSAmIENQSF9BUFBfVFhfTU9EX0FERF9NSF9CWV9EUklWRVIpCisgICAgeworICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgfD0gTVZfRVRIX0ZfTUg7CisgICAgfSAKKworICAgIGlmIChtb2RfYm0gJiBDUEhfQVBQX1RYX01PRF9OT19QQUQpCisgICAgeworICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgfD0gTVZfRVRIX0ZfTk9fUEFEOworICAgIH0gCisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9zZXRfZnJ3ZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24KKyoKKyogSU5QVVRTOgorKiAgICAgICBza2IgICAgICAgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9kaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyogICAgICAgZnJ3ZF9ibSAgICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlICAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2Zyd2QgKAorICAgIHN0cnVjdCBza19idWZmICAgICAgICAqc2tiLAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpIAoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX1RSR19QT1JUKQorICAgIHsKKyAgICAgICB0eF9zcGVjX291dC0+dHhwID0gZnJ3ZF92YWx1ZS0+dHJnX3BvcnQ7CisgICAgfSAKKworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUVVFVUUpCisgICAgeworICAgICAgIHR4X3NwZWNfb3V0LT50eHEgPSBmcndkX3ZhbHVlLT50cmdfcXVldWU7CisgICAgfSAKKworICAgIGlmIChmcndkX2JtICYgQ1BIX0FQUF9GUldEX1NFVF9HRU1fUE9SVCkKKyAgICB7CisgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAoKGZyd2RfdmFsdWUtPmdlbV9wb3J0IDw8IDgpfDB4MDAxMCk7CisgICAgfQorCisgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfcnhfYmMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgYnJvYWRjYXN0IHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgcGt0ICAgICAtIE1hcnZlbGwgcGFja2V0IGluZm9ybWF0aW9uCisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2FwcF9yeF9iYyhJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UICAgICAgZmxvd19ydWxlOworICAgIElOVDMyICAgICAgICAgICAgICAgICBwZWVyX3BvcnQgPSAwOworICAgIElOVDMyICAgICAgICAgICAgICAgICByeF9zaXplICAgPSAwOworICAgIElOVDMyICAgICAgICAgICAgICAgICBvZmZzZXQgICAgPSAwOworICAgIEJPT0wgICAgICAgICAgICAgICAgICBzdGF0ZSAgICAgPSBGQUxTRTsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAqc2tiX29sZCAgID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAqc2tiX25ldyAgID0gTlVMTDsKKyAgICBNVl9TVEFUVVMgICAgICAgICAgICAgcmMgICAgICAgID0gTVZfT0s7CisgICAgCisgICAgLyogQ2hlY2sgd2hldGhlciBuZWVkIHRvIGhhbmRsZSBicm9hZGNhc3QgcGFja2V0ICovCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fQkNfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gRkFMU0UpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogUGFyc2UgcGFja2V0cyAqLworICAgIHNrYl9vbGQgPSAoc3RydWN0IHNrX2J1ZmYgKikocGt0LT5vc0luZm8pOworICAgIHNrYl9uZXcgPSAoc3RydWN0IHNrX2J1ZmYgKikocGt0LT5vc0luZm8pOworICAgIHJjID0gY3BoX2Zsb3dfcGFyc2VfcGFja2V0KHBvcnQsIHNrYl9vbGQtPmRhdGEsIFRSVUUsIFRSVUUsICZmbG93X3J1bGUpOworICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZmFpbCB0byBjYWxsIGNwaF9mbG93X3BhcnNlX3BhY2tldCwgcmM8JWQ+IFxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBVL1MgKi8KKyAgICBpZihmbG93X3J1bGUuZGlyID09IENQSF9ESVJfVVMpCisgICAgeyAgCisgICAgICAgIC8qIENvcHkgYSBuZXcgU0tCICovCisgICAgICAgIHNrYl9vbGQtPnRhaWwgKz0gcnhfZGVzYy0+ZGF0YVNpemU7CisgICAgICAgIHNrYl9vbGQtPmxlbiAgID0gcnhfZGVzYy0+ZGF0YVNpemU7CisgICAgICAgIHNrYl9uZXcgPSBza2JfY29weShza2Jfb2xkLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgaWYoc2tiX25ldyA9PSBOVUxMKQorICAgICAgICB7ICAgCisgICAgICAgICAgICBza2JfbmV3ID0gc2tiX29sZDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBGb3J3YXJkIHBhY2tldCB0byBwZWVyIHBvcnQgKi8KKyAgICAgICAgcmMgPSBjcGhfYXBwX3BhcnNlX3BlZXJfcG9ydChwb3J0LCAmcGVlcl9wb3J0KTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImZhaWwgdG8gY2FsbCBjcGhfYXBwX3BhcnNlX3BlZXJfcG9ydCwgcmM8JWQ+IFxuIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBGb3J3YXJkIHBhY2tldCAqLworICAgICAgICBtdl9uZXRfZGV2c1twZWVyX3BvcnRdLT5uZXRkZXZfb3BzLT5uZG9fc3RhcnRfeG1pdChza2Jfb2xkLCBtdl9uZXRfZGV2c1twZWVyX3BvcnRdKTsgICAgICAKKyAgICB9CitvdXQ6CisgICAgLyogU3RyaXBlIFZMQU4gdGFnLCB0aGVuIHNlbmQgdG8gTGludXggbmV0d29yayBzdGFjayAqLworICAgIG9mZnNldCAgICAgICAgID0gY3BoX2Zsb3dfc3RyaXBfdmxhbihUUlVFLCBza2JfbmV3LT5kYXRhKTsKKyAgICBza2JfbmV3LT5kYXRhICs9IG9mZnNldDsKKyAgICByeF9zaXplICAgICAgIC09IG9mZnNldDsKKworICAgIC8qIFN0cmlwIE1IICovCisgICAgc2tiX25ldy0+ZGF0YSArPSBNVl9FVEhfTUhfU0laRTsKKyAgICBvZmZzZXQgICAgICAgICs9IE1WX0VUSF9NSF9TSVpFOworCisgICAgc2tiX25ldy0+dGFpbCAgICAtPSBvZmZzZXQ7CisgICAgc2tiX25ldy0+bGVuICAgICAtPSBvZmZzZXQ7CisgICAgc2tiX25ldy0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2JfbmV3LCBkZXYpOworCisgICAgY3BoX3JlY19za2IocG9ydCwgc2tiX25ldyk7CisKKyAgICByZXR1cm4gMTsgICAgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBwcm9maWxlIElEIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcHJvZmlsZV9pZChJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIHJldHVybiBtdHlwZV9sb29rdXBfZW51bV9zdHIoJmdfZW51bV9hcnJheV9wcm9maWxlX2lkLCBlbnVtX3ZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9wb25fdHlwZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBQT04gdHlwZSBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX3Bvbl90eXBlKElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X3Bvbl90eXBlLCBlbnVtX3ZhbHVlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9kaXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgZGlyZWN0aW9uIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfZGlyKElOVDMyIGVudW1fdmFsdWUpCit7CisgICAgcmV0dXJuIG10eXBlX2xvb2t1cF9lbnVtX3N0cigmZ19lbnVtX2FycmF5X2RpciwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfcnhfdHgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgUlgvVFggZGlyZWN0aW9uIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcnhfdHgoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfcnhfdHgsIGVudW1fdmFsdWUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX2dtYWMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgR01BQyBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX2dtYWMoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfZ21hYywgZW51bV92YWx1ZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgQ1BIIGFwcGxpY2F0aW9uIG1vZHVsZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2FwcF9pbml0KFZPSUQpCit7CisgICAgCisgICAgY3BoX2RiX2luaXQoKTsKKyAgICAKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF90cmFjZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046c2V0cyBjcGggdHJhY2UgZmxhZy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X3RyYWNlX2ZsYWcoVUlOVDMyIGZsYWcpCit7CisgICAgZ19jcGhfZ2xvYmFsX3RyYWNlID0gZmxhZzsKKyAgICAKKyAgICByZXR1cm4gTVZfT0s7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhhMDM1OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9hcHAuaApAQCAtMCwwICsxLDc3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9hcHAuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBhcHBsaWNhdGlvbiBtb2R1bGUgdG8gaW1wbGVtZW50CisqICAgICAgICAgICAgICBDUEggbWFpbiBsb2dpYyBhbmQgaGFuZGxlIGFwcGxpY2F0aW9uIHBhY2tldHMgc3VjaCBhcyBPTUNJLCBlT0FNLCAKKyogICAgICAgICAgICAgIElHTVAgcGFja2V0cy4KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0FQUF9IXworI2RlZmluZSBfTVZfQ1BIX0FQUF9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHlwZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNVl9WQUxJRF9NSF9NQVNLICAweDAwN0YgIC8qIFZhbGlkIE1IIGZpbGVkIGluIENQSCAqLworI2RlZmluZSBNVl9WQUxJRF9HSF9NQVNLICAweDBGRkYgIC8qIFZhbGlkIE1IIGZpbGVkIGluIENQSCAqLworCisKKy8qIENQSCBhcHBsaWNhdGlvbiBwYWNrZXRzIHBhcnNpbmcgZmllbGQgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9BUFBfUEFSU0VfRklFTERfRElSICAgICAgICAgID0gMHgxLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFggICAgICAgID0gMHgyLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfTUggICAgICAgICAgID0gMHg0LAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUgICAgID0gMHg4LAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUgID0gMHgxMCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSAgICA9IDB4MjAsCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSAgICAgPSAweDQwLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIgICAgID0gMHg4MCwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFICA9IDB4MTAwLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRU5EICAgICAgICAgID0gMHgyMDAKK30gQ1BIX0FQUF9QQVJTRV9GSUVMRF9FOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfRElSX1VTICAgICAgID0gMCwKKyAgICBDUEhfRElSX0RTICAgICAgID0gMSwKKyAgICBDUEhfRElSX05PVF9DQVJFID0gMiwKKyAgICBDUEhfRElSX05VTSAgICAgID0gMiwKKyAgICBDUEhfRElSX0lOVkFMSUQgID0gMworfSBDUEhfRElSX0U7CisKK3R5cGVkZWYgZW51bQoreworICAgIENQSF9ESVJfUlggICAgICAgICA9IDAsCisgICAgQ1BIX0RJUl9UWCAgICAgICAgID0gMSwKKyAgICBDUEhfUlhfVFhfTk9UX0NBUkUgPSAyLAorfSBDUEhfUlhfVFhfRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfRElSX0UgICBkaXI7CisgICAgQ1BIX1JYX1RYX0UgcnhfdHg7CisgICAgVUlOVDE2ICAgICAgbWg7CisgICAgVUlOVDE2ICAgICAgZXRoX3R5cGU7CisgICAgVUlOVDggICAgICAgZXRoX3N1YnR5cGU7CisgICAgVUlOVDggICAgICAgaXB2NF90eXBlOworICAgIFVJTlQ4ICAgICAgIGlwdjZfbmgxOworICAgIFVJTlQ4ICAgICAgIGlwdjZfbmgyOworICAgIFVJTlQzMiAgICAgIGljbXB2Nl90eXBlOworfSBDUEhfQVBQX1BBUlNFX1Q7CisKKy8qIENQSCBhcHBsaWNhdGlvbiBwYWNrZXRzIG1vZGlmaWNhdGlvbiBmaWVsZCBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0FQUF9SWF9NT0RfQUREX0dNQUMgICAgICAgICAgID0gMHgxLAorICAgIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSA9IDB4MiwKKyAgICBDUEhfQVBQX1JYX01PRF9TVFJJUF9NSCAgICAgICAgICAgPSAweDQsCisgICAgQ1BIX0FQUF9UWF9NT0RfQUREX01IX0JZX0RSSVZFUiAgID0gMHg4LAorICAgIENQSF9BUFBfVFhfTU9EX05PX1BBRCAgICAgICAgICAgICA9IDB4MTAsCisgICAgQ1BIX0FQUF9NT0RfQ0hBTkdFX1NUQVRFICAgICAgICAgID0gMHgyMCwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FTkQgICAgICAgICAgICAgPSAweDQwCit9IENQSF9BUFBfTU9EX0ZJRUxEX0U7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDE2ICAgcHJvdG9fdHlwZTsKKyAgICBCT09MICAgICBzdGF0ZTsKK30gQ1BIX0FQUF9NT0RfVDsKKworLyogQ1BIIGFwcGxpY2F0aW9uIHBhY2tldHMgZm9yd2FyZGluZyBmaWVsZCBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUE9SVCAgICAgPSAweDEsCisgICAgQ1BIX0FQUF9GUldEX1NFVF9UUkdfUVVFVUUgICAgPSAweDIsCisgICAgQ1BIX0FQUF9GUldEX1NFVF9HRU1fUE9SVCAgICAgPSAweDQsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0VORCAgICAgICAgPSAweDgKK30gQ1BIX0FQUF9GUldEX0ZJRUxEX0U7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDggICB0cmdfcG9ydDsKKyAgICBVSU5UOCAgIHRyZ19xdWV1ZTsKKyAgICBVSU5UMTYgIGdlbV9wb3J0OworfSBDUEhfQVBQX0ZSV0RfVDsKKworLyogVFBNIGNvbm5lY3Rpb24gcHJvZmlsZSBkZWZpbml0aW9uIGZyb20gInRwbV90eXBlcy5oIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgVFBNX1BPTl9XQU5fRFVBTF9NQUNfSU5UX1NXSVRDSCA9IDEsCisgICAgVFBNX1BPTl9XQU5fRzBfSU5UX1NXSVRDSCwKKyAgICBUUE1fUE9OX1dBTl9HMV9MQU5fRzBfSU5UX1NXSVRDSCwKKyAgICBUUE1fRzBfV0FOX0cxX0lOVF9TV0lUQ0gsCisgICAgVFBNX0cxX1dBTl9HMF9JTlRfU1dJVENILAorICAgIFRQTV9QT05fRzFfV0FOX0cwX0lOVF9TV0lUQ0gsCisgICAgVFBNX1BPTl9HMF9XQU5fRzFfSU5UX1NXSVRDSCwKKyAgICBUUE1fUE9OX1dBTl9EVUFMX01BQ19FWFRfU1dJVENILAorICAgIFRQTV9QT05fV0FOX0cxX01OR19FWFRfU1dJVENILAorICAgIFRQTV9QT05fV0FOX0cwX1NJTkdMRV9QT1JULAorICAgIFRQTV9QT05fV0FOX0cxX1NJTkdMRV9QT1JULAorICAgIFRQTV9QT05fRzFfV0FOX0cwX1NJTkdMRV9QT1JULAorICAgIFRQTV9QT05fRzBfV0FOX0cxX1NJTkdMRV9QT1JULAorICAgIFRQTV9QT05fV0FOX0cwX0cxX0xQQkssCisgICAgVFBNX1BPTl9XQU5fRzBfRzFfRFVBTF9MQU4KK30gdHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdDsKKworLyogUE9OIHR5cGUgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9QT05fVFlQRV9FUE9OID0gMCwKKyAgICBDUEhfUE9OX1RZUEVfR1BPTiwKKyAgICBDUEhfUE9OX1RZUEVfR0JFLAorICAgIENQSF9QT05fVFlQRV9QMlAsCisgICAgQ1BIX1BPTl9UWVBFX01BWAorfSBDUEhfUE9OX1RZUEVfRTsKKworCisvKiBDUEggZmVhdHVyZSBmbGFnCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtCit7CisgICAgQ1BIX0FQUF9GRUFUVVJFX0FQUCA9IDAsCisgICAgQ1BIX0FQUF9GRUFUVVJFX0lHTVAsCisgICAgQ1BIX0FQUF9GRUFUVVJFX0JDLAorICAgIENQSF9BUFBfRkVBVFVSRV9GTE9XLAorICAgIENQSF9BUFBfRkVBVFVSRV9VRFAsCit9IENQSF9BUFBfRkVBVFVSRV9FOworCisKKy8qIENQSCBwYXJzZS9tb2RpZmljYXRpb24gZmllbGQgZGVmaW5pdGlvbiBmb3IgYmMvaWdtcCAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9ESVJfRSAgICAgIGRpcjsgICAKKyAgICBVSU5UMzIgICAgICAgICBzcmNfcG9ydDsKKyAgICBVSU5UMTYgICAgICAgICB2aWQ7CisgICAgVUlOVDggICAgICAgICAgcGJpdHM7CisgICAgVUlOVDggICAgICAgICAgZHNjcDsKK30gQ1BIX1BBQ0tFVF9QQVJTRV9UOworCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ1BIX0RJUl9FICAgICAgZGlyOyAgIAorICAgIFVJTlQzMiAgICAgICAgIHNyY19wb3J0OworICAgIFVJTlQxNiAgICAgICAgIHZpZDsKKyAgICBVSU5UOCAgICAgICAgICBwYml0czsKKyAgICBVSU5UOCAgICAgICAgICBkc2NwOworfSBDUEhfUEFDS0VUX01PRF9UOworCisvKiBHTUFDIHBvcnQgc3RhdGUgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgTVZfQVBQX1BPUlRfVFlQRV9FICAgcG9ydF90eXBlOworICAgIE1WX0dFX1BPUlRfU1RBVEVfRSAgIHBvcnRfc3RhdGU7Cit9IENQSF9QT1JUX1NUQVRFX1Q7CisKKy8qIERlYnVnIHJlbGF0ZWQgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBVSU5UMzIgZ19jcGhfZ2xvYmFsX3RyYWNlOworCisjZGVmaW5lIENQSF9HTE9CQUxfVFJBQ0UgZ19jcGhfZ2xvYmFsX3RyYWNlCisjZGVmaW5lIENQSF9ERUJVR19MRVZFTCAgMHgwMDAwMDAwMQorI2RlZmluZSBDUEhfSU5GT19MRVZFTCAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ1BIX1dBUk5fTEVWRUwgICAweDAwMDAwMDA0CisjZGVmaW5lIENQSF9FUlJfTEVWRUwgICAgMHgwMDAwMDAwOAorCisjZGVmaW5lIE1WX0NQSF9QUklOVChsZXZlbCwgZm9ybWF0LCAuLi4pIFwKKyAgICB7IFwKKyAgICAgICAgaWYgKGxldmVsICYgQ1BIX0dMT0JBTF9UUkFDRSkgXAorICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXMobGluZTolZCkgImZvcm1hdCwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB9CisKKyNkZWZpbmUgTVZfQ1BIX0NMRUFOX1BSSU5UKGxldmVsLCBmb3JtYXQsIC4uLikgXAorICAgIHsgXAorICAgICAgICBpZiAobGV2ZWwgJiBDUEhfR0xPQkFMX1RSQUNFKSBcCisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPIGZvcm1hdCwgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9jb21wbGV4X3Byb2ZpbGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IFRQTSBjb21wbGV4IHByb2ZpbGUgSUQgCisqCisqIElOUFVUUzoKKyogICAgICAgcHJvZmlsZV9pZCAgIC0gVFBNIGNvbXBsZXggcHJvZmlsZSBJRAorKiAgICAgICBhY3RpdmVfcG9ydCAgLSBBY3RpdmUgV0FOIHBvcnQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfc2V0X2NvbXBsZXhfcHJvZmlsZSAodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCBwcm9maWxlX2lkLCBNVl9BUFBfR01BQ19QT1JUX0UgYWN0aXZlX3BvcnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfc2V0X2ZlYXR1cmVfZmxhZygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBFbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlIHN1cHBvcnQgaW4gQ1BIIAorKgorKiBJTlBVVFM6CisqICAgICAgIGZlYXR1cmUgLSBDUEggc3VwcG9ydGVkIGZlYXR1cmVzCisqICAgICAgIHN0YXRlICAgLSBFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGZlYXR1cmUgaW4gQ1BICisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3NldF9mZWF0dXJlX2ZsYWcgKENQSF9BUFBfRkVBVFVSRV9FIGZlYXR1cmUsIEJPT0wgc3RhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfYWRkX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQWRkIENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfYWRkX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9kZWxfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWwgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9kZWxfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3VwZGF0ZV9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBDUEggcnVsZSAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3VwZGF0ZV9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksICAKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLCAKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfZ2V0X3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfZ2V0X3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICptb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBydWxlIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9nZXRfcnVsZV9ieV9kaXJfcHJvdG8gKAorICAgIENQSF9ESVJfRSAgICAgICAgICAgICAgZGlyLAorICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgcHJvdG9fdHlwZSwKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgKnBhcnNlX2JtLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAqbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICAqbW9kX3ZhbHVlLAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICAqZnJ3ZF9ibSwKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbmNyZWFzZSBSWCBjb3VudGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogIEluY3JlYXNlIFJYIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FIGRpciwKKyAgICBVSU5UMTYgICAgcHJvdG9fdHlwZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9wYXJzZV9nZV9wb3J0X3R5cGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IEdFTUFDIHBvcnQgdHlwZSBieSBwcm9maWxlIElECisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgcG9ydF90eXBlICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX3BhcnNlX2dlX3BvcnRfdHlwZSAoCisgICAgQ1BIX1BPUlRfU1RBVEVfVCAgICAgICAgICAqcG9ydF90eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX2RpcigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBhcHBsaWNhdGlvbiBwYWNrZXQgdG8gb3V0cHV0IHBhcnNlIGJpdG1hcCBhbmQgdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAtIEdFIE1BQyBwb3J0CisqICAgICAgIHJ4ICAgIC0gV2hldGhlciBSWCBwYXRoCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFJldHVybiBkaXJlY3Rpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ1BIX0RJUl9FIGNwaF9hcHBfcGFyc2VfZGlyICgKKyAgICBJTlQzMiAgICBwb3J0LAorICAgIEJPT0wgICAgIHJ4KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhcnNlX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBhcHBsaWNhdGlvbiBwYWNrZXQgdG8gb3V0cHV0IHBhcnNlIGJpdG1hcCBhbmQgdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgICAgIC0gR0UgTUFDIHBvcnQKKyogICAgICAgc2tiX2RhdGEgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9sZGluZyBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9wYXJzZV9wYWNrZXQgKAorICAgIElOVDMyICAgICAgICAgICAgICAgICAgcG9ydCwKKyAgICBVSU5UOCAgICAgICAgICAgICAgICAgKnNrYl9kYXRhLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX21vZF9yeF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IFJYIGFwcGxpY2F0aW9uIHBhY2tldAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgZGV2ICAgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHJ4X2Rlc2MgICAtIFJYIGRlc2NyaXB0b3IKKyogICAgICAgbW9kX2JtICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgLSBNb2RpZmljYXRpb24gdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9hcHBfbW9kX3J4X3BhY2tldCAoICAKKyAgICBJTlQzMiAgICAgICAgICAgICAgICBwb3J0LAorICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiwKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICpza2IsCisgICAgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYywKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgKm1vZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9tb2RfdHhfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBUWCBhcHBsaWNhdGlvbiBwYWNrZXQKKyoKKyogSU5QVVRTOgorKiAgICAgICBza2IgICAgICAgICAtIFBvaW50ZXIgdG8gU0tCIGRhdGEgaG9kaW5nIGFwcGxpY2F0aW9uIHBhY2tldAorKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyogICAgICAgbW9kX2JtICAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfYXBwX21vZF90eF9wYWNrZXQgKAorICAgIHN0cnVjdCBza19idWZmICAgICAgICAqc2tiLAorICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQsCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICAqbW9kX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3NldF9mcndkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbgorKgorKiBJTlBVVFM6CisqICAgICAgIHNrYiAgICAgICAgIC0gUG9pbnRlciB0byBTS0IgZGF0YSBob2RpbmcgYXBwbGljYXRpb24gcGFja2V0CisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKiAgICAgICBmcndkX2JtICAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2FwcF9zZXRfZnJ3ZCAoCisgICAgc3RydWN0IHNrX2J1ZmYgICAgICAgICpza2IsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9yeF9iYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBicm9hZGNhc3QgcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgcnhfZGVzYyAtIFJYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMS4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgMC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfYXBwX3J4X2JjKElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGhfcGJ1ZiAqcGt0LCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9wcm9maWxlX2lkKCkKKyoKKyogREVTQ1JJUFRJT046bG9va3VwIHByb2ZpbGUgSUQgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9wcm9maWxlX2lkKElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfbG9va3VwX3Bvbl90eXBlKCkKKyoKKyogREVTQ1JJUFRJT046bG9va3VwIFBPTiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2FwcF9sb29rdXBfcG9uX3R5cGUoSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2FwcF9sb29rdXBfZGlyKCkKKyoKKyogREVTQ1JJUFRJT046bG9va3VwIGRpcmVjdGlvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgZW51bV92YWx1ZSAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKmNwaF9hcHBfbG9va3VwX2RpcihJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9yeF90eCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBSWC9UWCBkaXJlY3Rpb24gc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9yeF90eChJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX2xvb2t1cF9nbWFjKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIEdNQUMgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfYXBwX2xvb2t1cF9nbWFjKElOVDMyIGVudW1fdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9hcHBfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyBDUEggYXBwbGljYXRpb24gbW9kdWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfYXBwX2luaXQoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3NldF90cmFjZV9mbGFnKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046c2V0cyBjcGggdHJhY2UgZmxhZy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfc2V0X3RyYWNlX2ZsYWcoVUlOVDMyIGZsYWcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9BUFBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kYi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2RiLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmU0ZDA2MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kYi5jCkBAIC0wLDAgKzEsMTU0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9kYi5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGRhdGEgYmFzZSBpbXBsZW1lbnRhdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKyNpbmNsdWRlICJlenhtbC5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFZhcmlhYmxlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX0FQUF9EQl9UIGdfY3BoX2FwcF9kYjsKK0NIQVIgKmdfY3BoX3htbF9jZmdfZmlsZSAgICAgICAgID0gVVNfQ1BIX1hNTF9DRkdfRklMRTsKK0NIQVIgKmdfb251X3Byb2ZpbGVfeG1sX2NmZ19maWxlID0gVVNfT05VX1BST0ZJTEVfWE1MX0NGR19GSUxFOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9zZXRfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0IENQSCBEQiBwYXJhbWV0ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJhbSAgIC0gVGhlIHBhcmFtZXRlciB0eXBlCisqICAgICAgIHZhbHVlICAgLSBQYXJhbWV0ZXIgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9zZXRfcGFyYW0gKENQSF9EQl9QQVJBTV9FIHBhcmFtLCBWT0lEICp2YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHN3aXRjaCAocGFyYW0pCisgICAgeworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9QUk9GSUxFX0lEOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLnByb2ZpbGVfaWQgICA9ICoodHBtX2V0aF9jb21wbGV4X3Byb2ZpbGVfdCAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmFjdGl2ZV9wb3J0ICA9ICooTVZfQVBQX0dNQUNfUE9SVF9FICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuYXBwX3N1cHBvcnQgID0gKihCT09MICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fSUdNUF9TVVBQT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmlnbXBfc3VwcG9ydCA9ICooQk9PTCAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0JDX1NVUFBPUlQ6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuYmNfc3VwcG9ydCAgID0gKihCT09MICopdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLmZsb3dfc3VwcG9ydCA9ICooQk9PTCAqKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX1VEUF9TVVBQT1JUOgorICAgICAgICAgICAgZ19jcGhfYXBwX2RiLnVkcF9zdXBwb3J0ICA9ICooQk9PTCAqKXZhbHVlOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX0JDX0NPVU5URVI6CisgICAgICAgICAgICBnX2NwaF9hcHBfZGIuYmNfY291bnQgICAgID0gKihVSU5UMzIgKil2YWx1ZTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBEQiBwYXJhbWV0ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJhbSAgIC0gVGhlIHBhcmFtZXRlciB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIHZhbHVlICAgLSBQYXJhbWV0ZXIgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfcGFyYW0gKENQSF9EQl9QQVJBTV9FIHBhcmFtLCBWT0lEICp2YWx1ZSkKK3sKKyAgICBNVl9TVEFUVVMgcmMgPSBNVl9PSzsKKworICAgIHN3aXRjaCAocGFyYW0pCisgICAgeworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9QUk9GSUxFX0lEOgorICAgICAgICAgICAgKih0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90ICopdmFsdWUgPSBnX2NwaF9hcHBfZGIucHJvZmlsZV9pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9BQ1RJVkVfUE9SVDoKKyAgICAgICAgICAgICooTVZfQVBQX0dNQUNfUE9SVF9FICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuYWN0aXZlX3BvcnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQVBQX1NVUFBPUlQ6CisgICAgICAgICAgICAqKEJPT0wgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5hcHBfc3VwcG9ydDsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9EQl9QQVJBTV9JR01QX1NVUFBPUlQ6CisgICAgICAgICAgICAqKEJPT0wgKil2YWx1ZSA9IGdfY3BoX2FwcF9kYi5pZ21wX3N1cHBvcnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQkNfU1VQUE9SVDoKKyAgICAgICAgICAgICooQk9PTCAqKXZhbHVlID0gZ19jcGhfYXBwX2RiLmJjX3N1cHBvcnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JUOgorICAgICAgICAgICAgKihCT09MICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuZmxvd19zdXBwb3J0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1BIX0RCX1BBUkFNX1VEUF9TVVBQT1JUOgorICAgICAgICAgICAgKihCT09MICopdmFsdWUgPSBnX2NwaF9hcHBfZGIudWRwX3N1cHBvcnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfREJfUEFSQU1fQkNfQ09VTlRFUjoKKyAgICAgICAgICAgICooVUlOVDMyICopdmFsdWUgPSBnX2NwaF9hcHBfZGIuYmNfY291bnQ7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2NvbXBhcmVfcnVsZXMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSB0aGUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSBvZiB0d28gcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibV8xICAgLSBQYXJzaW5nIGJpdG1hcCBvZiBmaXJzdCBDUEggcnVsZQorKiAgICAgICBwYXJzZV9rZXlfMSAgLSBQYXJzaW5nIGtleSBvZiBmaXJzdCBDUEggcnVsZQorKiAgICAgICBwYXJzZV9ibV8yICAgLSBQYXJzaW5nIGJpdG1hcCBvZiBzZWNvbmQgQ1BIIHJ1bGUKKyogICAgICAgcGFyc2Vfa2V5XzIgIC0gUGFyc2luZyBrZXkgb2Ygc2Vjb25kIENQSCBydWxlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2NvbXBhcmVfcnVsZXMgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibV8xLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5XzEsIAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibV8yLAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXlfMikKK3sKKyAgICBpZiAocGFyc2VfYm1fMSA9PSBwYXJzZV9ibV8yKQorICAgIHsKKyAgICAgICAgLyogQ29tcGFyZSBkaXJlY3Rpb24gKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5kaXIgIT0gcGFyc2Vfa2V5XzItPmRpcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGRpclslZF0sIG5ldyBkaXJbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmRpciwgcGFyc2Vfa2V5XzItPmRpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBSWCBkaXJlY3Rpb24gKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPnJ4X3R4ICE9IHBhcnNlX2tleV8yLT5yeF90eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIHJ4X3R4WyVkXSwgbmV3IHJ4X3R4WyVkXSBcbiIsIHBhcnNlX2tleV8xLT5yeF90eCwgcGFyc2Vfa2V5XzItPnJ4X3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgTWFydmVsbCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPm1oICE9IHBhcnNlX2tleV8yLT5taCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIG1oWyVkXSwgbmV3IG1oWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5taCwgcGFyc2Vfa2V5XzItPm1oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIEV0aCB0eXBlICovCisgICAgICAgIGlmIChwYXJzZV9ibV8xICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnNlX2tleV8xLT5ldGhfdHlwZSE9IHBhcnNlX2tleV8yLT5ldGhfdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGV0aF90eXBlWyVkXSwgbmV3IGV0aF90eXBlWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5ldGhfdHlwZSwgcGFyc2Vfa2V5XzItPmV0aF90eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgRXRoIHN1YnR5cGUgKi8KKyAgICAgICAgaWYgKHBhcnNlX2JtXzEgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmV0aF9zdWJ0eXBlICE9IHBhcnNlX2tleV8yLT5ldGhfc3VidHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiT2xkIGV0aF9zdWJ0eXBlWyVkXSwgbmV3IGV0aF9zdWJ0eXBlWyVkXSBcbiIsIHBhcnNlX2tleV8xLT5ldGhfc3VidHlwZSwgcGFyc2Vfa2V5XzItPmV0aF9zdWJ0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIElQVjQgdHlwZSAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNF9UWVBFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5XzEtPmlwdjRfdHlwZSAhPSBwYXJzZV9rZXlfMi0+aXB2NF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgaXB2NF90eXBlWyVkXSwgbmV3IGlwdjRfdHlwZVslZF0gXG4iLCBwYXJzZV9rZXlfMS0+aXB2NF90eXBlLCBwYXJzZV9rZXlfMi0+aXB2NF90eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDb21wYXJlIElQVjYgdHlwZSAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+aXB2Nl9uaDEgIT0gcGFyc2Vfa2V5XzItPmlwdjZfbmgxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgaXB2Nl9uaDFbJWRdLCBuZXcgaXB2Nl9uaDFbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmlwdjZfbmgxLCBwYXJzZV9rZXlfMi0+aXB2Nl9uaDEpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbXBhcmUgSVB2NiBOSCAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+aXB2Nl9uaDIhPSBwYXJzZV9rZXlfMi0+aXB2Nl9uaDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk9sZCBpcHY2X25oMlslZF0sIG5ldyBpcHY2X25oMlslZF0gXG4iLCBwYXJzZV9rZXlfMS0+aXB2Nl9uaDIsIHBhcnNlX2tleV8yLT5pcHY2X25oMik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29tcGFyZSBJQ01QdjYgdHlwZSAqLworICAgICAgICBpZiAocGFyc2VfYm1fMSAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9rZXlfMS0+aWNtcHY2X3R5cGUgIT0gcGFyc2Vfa2V5XzItPmljbXB2Nl90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJPbGQgaWNtcHY2X3R5cGVbJWRdLCBuZXcgaWNtcHY2X3R5cGVbJWRdIFxuIiwgcGFyc2Vfa2V5XzEtPmljbXB2Nl90eXBlLCBwYXJzZV9rZXlfMi0+aWNtcHY2X3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9jb21wYXJlX3J1bGVfYW5kX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIHRoZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5IG9mIENQSCBhbmQgdGhlIHBhY2tldAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtX3J1bGUgICAgIC0gUGFyc2luZyBiaXRtYXAgb2YgQ1BIIHJ1bGUKKyogICAgICAgcGFyc2Vfa2V5X3J1bGUgICAgLSBQYXJzaW5nIGtleSBvZiBDUEggcnVsZQorKiAgICAgICBwYXJzZV9ibV9wYWNrZXQgICAtIFBhcnNpbmcgYml0bWFwIG9mIHBhY2tldAorKiAgICAgICBwYXJzZV9rZXlfcGFja2V0ICAtIFBhcnNpbmcga2V5IG9mIHBhY2tldAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBJbiBjYXNlIHNhbWUsIHJldHVybiBUUlVFLCAKKyogICAgICAgSW4gY2FzZSBkaWZmZXJlbnQsIHJldHVybiBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9kYl9jb21wYXJlX3J1bGVfYW5kX3BhY2tldCAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtX3J1bGUsCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleV9ydWxlLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibV9wYWNrZXQsCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleV9wYWNrZXQpCit7ICAKKyAgICAvKiBDaGVjayBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKQorICAgIHsKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5kaXIgIT0gQ1BIX0RJUl9OT1RfQ0FSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfRElSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBkaXIgZmllbGRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5kaXIgIT0gcGFyc2Vfa2V5X3BhY2tldC0+ZGlyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgZGlyWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGRpclslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+ZGlyLCBwYXJzZV9rZXlfcnVsZS0+ZGlyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBSWC9UWCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpCisgICAgeworICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPnJ4X3R4ICE9IENQSF9SWF9UWF9OT1RfQ0FSRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGRpciBSWC9UWCBmaWVsZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPnJ4X3R4ICE9IHBhcnNlX2tleV9wYWNrZXQtPnJ4X3R4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgcnhfdHhbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgcnhfdHhbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPnJ4X3R4LCBwYXJzZV9rZXlfcnVsZS0+cnhfdHgpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIE1hcnZlbGwgaGVhZGVyICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfTUgpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBNSCBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+bWggIT0gcGFyc2Vfa2V5X3BhY2tldC0+bWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgbWhbMHgleF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBtaFsweCV4XSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5taCwgcGFyc2Vfa2V5X3J1bGUtPm1oKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIEV0aCB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9UWVBFKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1RZUEUpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBldGhfdHlwZSBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+ZXRoX3R5cGUgIT0gcGFyc2Vfa2V5X3BhY2tldC0+ZXRoX3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgZXRoX3R5cGVbMHgleF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBldGhfdHlwZVsweCV4XSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5ldGhfdHlwZSwgcGFyc2Vfa2V5X3J1bGUtPmV0aF90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIEV0aCBzdWJ0eXBlICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0VUSF9TVUJUWVBFKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfRVRIX1NVQlRZUEUpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBldGhfc3VidHlwZSBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+ZXRoX3N1YnR5cGUgIT0gcGFyc2Vfa2V5X3BhY2tldC0+ZXRoX3N1YnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgZXRoX3N1YnR5cGVbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgZXRoX3N1YnR5cGVbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmV0aF9zdWJ0eXBlLCBwYXJzZV9rZXlfcnVsZS0+ZXRoX3N1YnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgSVBWNCB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjRfVFlQRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGlwdjRfdHlwZSBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+aXB2NF90eXBlICE9IHBhcnNlX2tleV9wYWNrZXQtPmlwdjRfdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBpcHY0X3R5cGVbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgaXB2NF90eXBlWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5pcHY0X3R5cGUsIHBhcnNlX2tleV9ydWxlLT5pcHY0X3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgSVBWNiBOSDEgKi8KKyAgICBpZiAocGFyc2VfYm1fcnVsZSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDEpCisgICAgeworICAgICAgICBpZiAoISAocGFyc2VfYm1fcGFja2V0ICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaGFzIG5vIGlwdjZfbmgxIGZpZWxkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHBhcnNlX2tleV9ydWxlLT5pcHY2X25oMSAhPSBwYXJzZV9rZXlfcGFja2V0LT5pcHY2X25oMSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBpcHY2X25oMVslZF0gaXMgZGlmZmVyZW50IHdpdGggcnVsZSBpcHY2X25oMVslZF0sIG1pcy1tYXRoY2VkIVxuIiwgcGFyc2Vfa2V5X3BhY2tldC0+aXB2Nl9uaDEsIHBhcnNlX2tleV9ydWxlLT5pcHY2X25oMSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDaGVjayBJUHY2IE5IMiAqLworICAgIGlmIChwYXJzZV9ibV9ydWxlICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY2X05IMikKKyAgICB7CisgICAgICAgIGlmICghIChwYXJzZV9ibV9wYWNrZXQgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgyKSkKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlBhY2tldCBoYXMgbm8gaXB2Nl9uaDIgZmllbGRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocGFyc2Vfa2V5X3J1bGUtPmlwdjZfbmgyICE9IHBhcnNlX2tleV9wYWNrZXQtPmlwdjZfbmgyKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGlwdjZfbmgyWyVkXSBpcyBkaWZmZXJlbnQgd2l0aCBydWxlIGlwdjZfbmgyWyVkXSwgbWlzLW1hdGhjZWQhXG4iLCBwYXJzZV9rZXlfcGFja2V0LT5pcHY2X25oMiwgcGFyc2Vfa2V5X3J1bGUtPmlwdjZfbmgyKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIElDTVB2NiB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtX3J1bGUgJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKQorICAgIHsKKyAgICAgICAgaWYgKCEgKHBhcnNlX2JtX3BhY2tldCAmIENQSF9BUFBfUEFSU0VfRklFTERfSUNNUFY2X1RZUEUpKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IGhhcyBubyBpY21wdjZfdHlwZSBmaWVsZFxuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChwYXJzZV9rZXlfcnVsZS0+aWNtcHY2X3R5cGUgIT0gcGFyc2Vfa2V5X3BhY2tldC0+aWNtcHY2X3R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJQYWNrZXQgaWNtcHY2X3R5cGVbJWRdIGlzIGRpZmZlcmVudCB3aXRoIHJ1bGUgaWNtcHY2X3R5cGVbJWRdLCBtaXMtbWF0aGNlZCFcbiIsIHBhcnNlX2tleV9wYWNrZXQtPmljbXB2Nl90eXBlLCBwYXJzZV9rZXlfcnVsZS0+aWNtcHY2X3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2NoZWNrX2R1cGxpY2F0ZV9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZHVwbGljYXRlIENQSCBydWxlIHcvIHNhbWUgcGFyc2UgYml0bWFwCisqICAgICAgICAgICAgICB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBoYXMgZHVwbGljYXRlZCBydWxlLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgaGFzIG5vdCBkdXBsaWNhdGVkIHJ1bGUsIHJldHVybiBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIGNwaF9kYl9jaGVja19kdXBsaWNhdGVfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICAgPSBGQUxTRTsKKyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZGJfY29tcGFyZV9ydWxlcyhwX2NwaF9ydWxlLT5wYXJzZV9ibSwgJnBfY3BoX3J1bGUtPnBhcnNlX2tleSwgcGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgICAgICAgICBpZiAocmMgPT0gVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2FkZF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSB0byBkYXRhIGJhc2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfYWRkX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXksCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlLAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgID0gVFJVRTsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICAvKiBTZWFjaCBmb3IgYW4gZnJlZSBlbnRyeSAqLworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU07IGlkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKGdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdLnZhbGlkID09IEZBTFNFKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogTm8gZnJlZSBlbnRyeSAqLworICAgIGlmIChpZHggPT0gQ1BIX0FQUF9NQVhfUlVMRV9OVU0pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIk5vIGZyZWUgQ1BIIGVudHJ5IFxuIik7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gTVZfRlVMTDsKKyAgICB9CisKKyAgICAvKiBEbyBub3QgYWRkIG5ldyBydWxlIGlmIHRoZXJlIGlzIGFscmVhZHkgZHVwbGljYXRlZCBydWxlICovCisgICAgcmMgPSBjcGhfZGJfY2hlY2tfZHVwbGljYXRlX3J1bGUocGFyc2VfYm0sIHBhcnNlX2tleSk7CisgICAgaWYgKHJjID09IFRSVUUpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIkFscmVhZHkgaGFzIGR1cGxpY2F0ZWQgcnVsZSwgY291bGQgbm90IGFkZCBuZXcgQ1BIIHJ1bGUgXG4iKTsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBNVl9FUlJPUjsKKyAgICB9ICAgICAgICAKKyAgICAKKyAgICAvKiBTYXZlIENQSCBydWxlIGZvciBhcHBsaWNhdGlvbiBwYWNrZXQgKi8KKyAgICBwX2NwaF9ydWxlID0gJmdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdOworICAgIHBfY3BoX3J1bGUtPnBhcnNlX2JtID0gcGFyc2VfYm07CisgICAgbWVtY3B5KCZwX2NwaF9ydWxlLT5wYXJzZV9rZXksICBwYXJzZV9rZXksICBzaXplb2YoQ1BIX0FQUF9QQVJTRV9UKSk7CisgICAgcF9jcGhfcnVsZS0+bW9kX2JtICAgPSBtb2RfYm07CisgICAgbWVtY3B5KCZwX2NwaF9ydWxlLT5tb2RfdmFsdWUsICBtb2RfdmFsdWUsICBzaXplb2YoQ1BIX0FQUF9NT0RfVCkpOworICAgIHBfY3BoX3J1bGUtPmZyd2RfYm0gID0gZnJ3ZF9ibTsKKyAgICBtZW1jcHkoJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUsIGZyd2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX0ZSV0RfVCkpOworICAgIHBfY3BoX3J1bGUtPnZhbGlkICAgID0gVFJVRTsKKyAgICBnX2NwaF9hcHBfZGIucnVsZV9udW0gKys7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2RlbF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgYXBwbGljYXRpb24gdHlwZSBDUEggcnVsZSBmcm9tIGRhdGEgYmFzZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kZWxfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RiX2NvbXBhcmVfcnVsZXMocF9jcGhfcnVsZS0+cGFyc2VfYm0sICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHBfY3BoX3J1bGUsIDAsIHNpemVvZihDUEhfQVBQX1JVTEVfVCkpOworICAgICAgICAgICAgICAgIHBfY3BoX3J1bGUtPnZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgZ19jcGhfYXBwX2RiLnJ1bGVfbnVtIC0tOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfdXBkYXRlX2FwcF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIGZyb20gZGF0YSBiYXNlIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyogICAgICAgbW9kX2JtICAgICAtIE1vZGlmaWNhdGlvbiBiaXRtYXAKKyogICAgICAgbW9kX3ZhbHVlICAtIE1vZGlmaWNhdGlvbiB2YWx1ZQorKiAgICAgICBmcndkX2JtICAgIC0gRm9yd2FyZGluZyBiaXRtYXAKKyogICAgICAgZnJ3ZF92YWx1ZSAtIEZvcndhcmRpbmcgdmFsdWUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sIAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsIAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RiX2NvbXBhcmVfcnVsZXMocF9jcGhfcnVsZS0+cGFyc2VfYm0sICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jcGhfcnVsZS0+bW9kX2JtICAgPSBtb2RfYm07CisgICAgICAgICAgICAgICAgbWVtY3B5KCZwX2NwaF9ydWxlLT5tb2RfdmFsdWUsICBtb2RfdmFsdWUsICBzaXplb2YoQ1BIX0FQUF9NT0RfVCkpOworICAgICAgICAgICAgICAgIHBfY3BoX3J1bGUtPmZyd2RfYm0gID0gZnJ3ZF9ibTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUsIGZyd2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX0ZSV0RfVCkpOworCisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfYXBwX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IGFwcGxpY2F0aW9uIHR5cGUgQ1BIIHJ1bGUgZnJvbSBkYXRhIGJhc2UgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF9hcHBfcnVsZSAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LCAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgKm1vZF9ibSwgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIFVJTlQzMiAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgICAgcnVsZV9pZHggICAgPSAwOworICAgIENQSF9BUFBfUlVMRV9UICAqcF9jcGhfcnVsZSAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgcmMgICAgICAgICAgPSBGQUxTRTsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgcGFyc2VfYm0gYW5kIHBhcnNlX2tleSAqLworICAgICAgICBpZiAocF9jcGhfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZGJfY29tcGFyZV9ydWxlX2FuZF9wYWNrZXQocF9jcGhfcnVsZS0+cGFyc2VfYm0sICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHBhcnNlX2JtLCBwYXJzZV9rZXkpOworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgaWYgKHBfY3BoX3J1bGUtPm1vZF92YWx1ZS5zdGF0ZSA9PSBUUlVFKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICptb2RfYm0gID0gcF9jcGhfcnVsZS0+bW9kX2JtOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkobW9kX3ZhbHVlLCAmcF9jcGhfcnVsZS0+bW9kX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9NT0RfVCkpOworICAgICAgICAgICAgICAgICAgICAqZnJ3ZF9ibSA9IHBfY3BoX3J1bGUtPmZyd2RfYm07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShmcndkX3ZhbHVlLCAmcF9jcGhfcnVsZS0+ZnJ3ZF92YWx1ZSwgc2l6ZW9mKENQSF9BUFBfRlJXRF9UKSk7CisKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9GQUlMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfYXBwX3J1bGVfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIGZyb20gZGF0YSBiYXNlIGJ5IHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FICAgICAgICAgICAgICBkaXIsCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICBwcm90b190eXBlLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXksICAgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIGlmICgocF9jcGhfcnVsZS0+bW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFKSAmJgorICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUucHJvdG9fdHlwZSA9PSBwcm90b190eXBlKSAmJgorICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUuc3RhdGUgICAgICA9PSBUUlVFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHBfY3BoX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpICYmCisgICAgICAgICAgICAgICAgICAgICgocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LmRpciA9PSBDUEhfRElSX05PVF9DQVJFKXx8KHBfY3BoX3J1bGUtPnBhcnNlX2tleS5kaXIgPT0gZGlyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5wYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpICYmCisgICAgICAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LnJ4X3R4ID09IENQSF9ESVJfVFgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhcnNlX2JtID0gcF9jcGhfcnVsZS0+cGFyc2VfYm07CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwYXJzZV9rZXksICZwX2NwaF9ydWxlLT5wYXJzZV9rZXksIHNpemVvZihDUEhfQVBQX1BBUlNFX1QpKTsKKyAgICAgICAgICAgICAgICAgICAgKm1vZF9ibSAgID0gcF9jcGhfcnVsZS0+bW9kX2JtOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkobW9kX3ZhbHVlLCAmcF9jcGhfcnVsZS0+bW9kX3ZhbHVlLCBzaXplb2YoQ1BIX0FQUF9NT0RfVCkpOworICAgICAgICAgICAgICAgICAgICAqZnJ3ZF9ibSAgPSBwX2NwaF9ydWxlLT5mcndkX2JtOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZnJ3ZF92YWx1ZSwgJnBfY3BoX3J1bGUtPmZyd2RfdmFsdWUsIHNpemVvZihDUEhfQVBQX0ZSV0RfVCkpOworCisgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIE1WX0ZBSUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2luY3JlYXNlX2NvdW50ZXIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5jcmVhc2UgUlggY291bnRlcgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX2JtICAgLSBQYXJzaW5nIGJpdG1hcAorKiAgICAgICBwYXJzZV9rZXkgIC0gUGFyc2luZyBrZXkKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgVUlOVDMyICAgICAgICAgICBpZHggICAgICAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0FQUF9SVUxFX1QgICpwX2NwaF9ydWxlICA9IE5VTEw7CisgICAgQk9PTCAgICAgICAgICAgICByYyAgICAgICAgICA9IE1WX0ZBSUw7CisgICAgdW5zaWduZWQgbG9uZyAgICBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnX2NwaF9hcHBfZGIuYXBwX2xvY2ssIGZsYWdzKTsgICAKKyAgICBmb3IgKGlkeCA9IDAsIHJ1bGVfaWR4ID0gMDsgKGlkeCA8IENQSF9BUFBfTUFYX1JVTEVfTlVNKSAmJiAocnVsZV9pZHggPCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfY3BoX3J1bGUgPSAmZ19jcGhfYXBwX2RiLmNwaF9ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhcnNlX2JtIGFuZCBwYXJzZV9rZXkgKi8KKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RiX2NvbXBhcmVfcnVsZV9hbmRfcGFja2V0KHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5LCBwYXJzZV9ibSwgcGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGlmIChwX2NwaF9ydWxlLT5tb2RfdmFsdWUuc3RhdGUgPT0gVFJVRSkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX2NwaF9ydWxlLT5jb3VudCsrOworCisgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046ICBJbmNyZWFzZSBSWCBjb3VudGVyIGFjY29yZGluZyB0byBwcm90b2NvbCB0eXBlCisqCisqIElOUFVUUzoKKyogICAgICAgZGlyICAgICAgICAtIERpcmVjdGlvbgorKiAgICAgICBwcm90b190eXBlIC0gU0tCIHByb3RvY29sIHR5cGUKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90byAoQ1BIX0RJUl9FIGRpciwKKyAgICBVSU5UMTYgICAgcHJvdG9fdHlwZSkKK3sKKyAgICBVSU5UMzIgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgIHJ1bGVfaWR4ICAgID0gMDsKKyAgICBDUEhfQVBQX1JVTEVfVCAgKnBfY3BoX3J1bGUgID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nICAgIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdfY3BoX2FwcF9kYi5hcHBfbG9jaywgZmxhZ3MpOyAgIAorICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgCisgICAgICAgIC8qIENvbXBhcmUgZGlyIGFuZCBwcm90b2NvbCB0eXBlICovCisgICAgICAgIGlmIChwX2NwaF9ydWxlLT52YWxpZCA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBydWxlX2lkeCsrOworCisgICAgICAgICAgICBpZiAoKHBfY3BoX3J1bGUtPm1vZF9ibSAmIENQSF9BUFBfUlhfTU9EX1JFUExBQ0VfUFJPVE9fVFlQRSkgJiYKKyAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnByb3RvX3R5cGUgPT0gcHJvdG9fdHlwZSkgJiYKKyAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+bW9kX3ZhbHVlLnN0YXRlICAgICAgPT0gVFJVRSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBpZiAoKHBfY3BoX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9ESVIpICYmCisgICAgICAgICAgICAgICAgICAgICgocF9jcGhfcnVsZS0+cGFyc2Vfa2V5LmRpciA9PSBDUEhfRElSX05PVF9DQVJFKSB8fCAKKyAgICAgICAgICAgICAgICAgICAgIChwX2NwaF9ydWxlLT5wYXJzZV9rZXkuZGlyID09IGRpcikpICYmCisgICAgICAgICAgICAgICAgICAgICAocF9jcGhfcnVsZS0+cGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX1JYX1RYKSAmJgorICAgICAgICAgICAgICAgICAgICAgKHBfY3BoX3J1bGUtPnBhcnNlX2tleS5yeF90eCA9PSBDUEhfRElSX1RYKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfY3BoX3J1bGUtPmNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ19jcGhfYXBwX2RiLmFwcF9sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfT0s7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X3htbF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgdGhlIFhNTCBwYXJhbWV0ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF94bWxfcGFyYW0oVk9JRCkKK3sKKyAgICBlenhtbF90ICAgICB4bWxfaGVhZDsKKyAgICBlenhtbF90ICAgICB4bWxfZWxlbWVudDsKKyAgICBlenhtbF90ICAgICB4bWxfYXR0cjsKKyAgICBVSU5UMzIgICAgICBhdHRyX3ZhbHVlID0gMDsKKyAgICBCT09MICAgICAgICBib29sX3ZhbHVlID0gVFJVRTsKKyAgICBjb25zdCBDSEFSICpuYW1lICAgICAgID0gTlVMTDsKKyAgICBjb25zdCBDSEFSICp2YWx1ZSAgICAgID0gTlVMTDsgIAorICAgIElOVDMyICAgICAgIHJjICAgICAgICAgPSBNVl9PSzsKKworICAgIC8qIFJlYWQgT05VIHByb2ZpbGUgWE1MIGZpbGUgKi8KKyAgICBpZiAoKHhtbF9oZWFkID0gZXp4bWxfcGFyc2VfZmlsZShnX29udV9wcm9maWxlX3htbF9jZmdfZmlsZSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9wYXJzZV9maWxlKCkgb2YgJXMgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBnX29udV9wcm9maWxlX3htbF9jZmdfZmlsZSk7CisgICAgICAgIHJjID0gTVZfTk9UX0ZPVU5EOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9QUk9GSUxFX0VMTV9DQVBBQklMSVRZLCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX1BST0ZJTEVfRUxNX0NBUEFCSUxJVFkpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisKKyAgICB9CisgICAgCisgICAgZm9yICh4bWxfYXR0ciA9IGV6eG1sX2NoaWxkKHhtbF9lbGVtZW50LCBYTUxfUFJPRklMRV9FTE1fQVRUUklCKTsgeG1sX2F0dHI7IHhtbF9hdHRyID0geG1sX2F0dHItPm5leHQpCisgICAgeyAKKyAgICAgICAgLyogUGFyc2UgYXR0cmlidXRlIHR5cGUgYW5kIHZhbHVlICovCisgICAgICAgIG5hbWUgPSBlenhtbF9hdHRyKHhtbF9hdHRyLCBYTUxfUFJPRklMRV9BVFRSX05BTUUpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9hdHRyKCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9QUk9GSUxFX0FUVFJfTkFNRSk7CisgICAgICAgICAgICByYyA9IE1WX05PVF9GT1VORDsgICAgICAgIAorICAgICAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIFhNTF9QUk9GSUxFX05BTUVfUFJPRklMRSkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBlenhtbF9hdHRyKHhtbF9hdHRyLCBYTUxfUFJPRklMRV9BVFRSX1ZBTFVFKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2F0dHIoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX1BST0ZJTEVfQVRUUl9WQUxVRSk7CisgICAgICAgICAgICAgICAgcmMgPSBNVl9OT1RfRk9VTkQ7ICAgICAgICAKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHZhbHVlKTsKKworICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fUFJPRklMRV9JRCwgJmF0dHJfdmFsdWUpOworICAgICAgICB9IAorICAgICAgICBlbHNlIGlmIChzdHJjbXAobmFtZSwgWE1MX1BST0ZJTEVfTkFNRV9BQ1RJVkVfUE9SVCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSBlenhtbF9hdHRyKHhtbF9hdHRyLCBYTUxfUFJPRklMRV9BVFRSX1ZBTFVFKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXM6IGV6eG1sX2F0dHIoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX1BST0ZJTEVfQVRUUl9WQUxVRSk7CisgICAgICAgICAgICAgICAgcmMgPSBNVl9OT1RfRk9VTkQ7ICAgICAgICAKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHZhbHVlKTsKKworICAgICAgICAgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fQUNUSVZFX1BPUlQsICZhdHRyX3ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGV6eG1sX2ZyZWUoeG1sX2hlYWQpOworCisgICAgLyogUmVhZCBDUEggWE1MIGZpbGUgKi8KKyAgICBpZiAoKHhtbF9oZWFkID0gZXp4bWxfcGFyc2VfZmlsZShnX2NwaF94bWxfY2ZnX2ZpbGUpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfcGFyc2VfZmlsZSgpIG9mICVzIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgZ19jcGhfeG1sX2NmZ19maWxlKTsKKyAgICAgICAgcmMgPSBNVl9OT1RfRk9VTkQ7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorCisgICAgLyogUmVhZCBhcHBsaWNhdGlvbiBzdXBwb3J0IGZsYWcqLworICAgIGlmICgoeG1sX2VsZW1lbnQgPSBlenhtbF9nZXQoeG1sX2hlYWQsIFhNTF9DUEhfRUxNX0FQUF9TVVBQT1JULCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX0NQSF9FTE1fQVBQX1NVUFBPUlQpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGlmICh4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiB4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHhtbF9lbGVtZW50LT50eHQpOworICAgIGJvb2xfdmFsdWUgPSAoYXR0cl92YWx1ZSAhPSAwKT8gVFJVRTpGQUxTRTsKKyAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVCwgJmJvb2xfdmFsdWUpOworCisgICAgLyogUmVhZCBJR01QIHN1cHBvcnQgZmxhZyovCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX0NQSF9FTE1fSUdNUF9TVVBQT1JULCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX0NQSF9FTE1fSUdNUF9TVVBQT1JUKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBpZiAoeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh4bWxfZWxlbWVudC0+dHh0KTsKKyAgICBib29sX3ZhbHVlID0gKGF0dHJfdmFsdWUgIT0gMCk/IFRSVUU6RkFMU0U7CisgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fSUdNUF9TVVBQT1JULCAmYm9vbF92YWx1ZSk7CisKKyAgICAvKiBSZWFkIEJDIHN1cHBvcnQgZmxhZyovCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX0NQSF9FTE1fQkNfU1VQUE9SVCwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9DUEhfRUxNX0JDX1NVUFBPUlQpOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGlmICh4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwpCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiB4bWxfZWxlbWVudC0+dHh0ID09IE5VTEwgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByYyA9IE1WX0ZBSUw7ICAgICAgICAKKyAgICAgICAgZ290byBmcmVlX2V4aXQ7CisgICAgfQorICAgIGF0dHJfdmFsdWUgPSBtdHlwZV9nZXRfZGlnaXRfbnVtKHhtbF9lbGVtZW50LT50eHQpOworICAgIGJvb2xfdmFsdWUgPSAoYXR0cl92YWx1ZSAhPSAwKT8gVFJVRTpGQUxTRTsKKyAgICBjcGhfZGJfc2V0X3BhcmFtKENQSF9EQl9QQVJBTV9CQ19TVVBQT1JULCAmYm9vbF92YWx1ZSk7CisKKyAgICAvKiBSZWFkIERhdGEgZmxvdyBtYXBwaW5nIHN1cHBvcnQgZmxhZyovCisgICAgaWYgKCh4bWxfZWxlbWVudCA9IGV6eG1sX2dldCh4bWxfaGVhZCwgWE1MX0NQSF9FTE1fRkxPV19TVVBQT1JULCAtMSkpID09IDApCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzOiBlenhtbF9nZXQoKSBvZiAlcyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgWE1MX0NQSF9FTE1fRkxPV19TVVBQT1JUKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBpZiAoeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh4bWxfZWxlbWVudC0+dHh0KTsKKyAgICBib29sX3ZhbHVlID0gKGF0dHJfdmFsdWUgIT0gMCk/IFRSVUU6RkFMU0U7CisgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JULCAmYm9vbF92YWx1ZSk7CisKKyAgICAvKiBSZWFkIFVEUCBwb3J0IG1hcHBpbmcgc3VwcG9ydCBmbGFnKi8KKyAgICBpZiAoKHhtbF9lbGVtZW50ID0gZXp4bWxfZ2V0KHhtbF9oZWFkLCBYTUxfQ1BIX0VMTV9VRFBfU1VQUE9SVCwgLTEpKSA9PSAwKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogZXp4bWxfZ2V0KCkgb2YgJXMgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIFhNTF9DUEhfRUxNX1VEUF9TVVBQT1JUKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBpZiAoeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlczogeG1sX2VsZW1lbnQtPnR4dCA9PSBOVUxMIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmMgPSBNVl9GQUlMOyAgICAgICAgCisgICAgICAgIGdvdG8gZnJlZV9leGl0OworICAgIH0KKyAgICBhdHRyX3ZhbHVlID0gbXR5cGVfZ2V0X2RpZ2l0X251bSh4bWxfZWxlbWVudC0+dHh0KTsKKyAgICBib29sX3ZhbHVlID0gKGF0dHJfdmFsdWUgIT0gMCk/IFRSVUU6RkFMU0U7CisgICAgY3BoX2RiX3NldF9wYXJhbShDUEhfREJfUEFSQU1fVURQX1NVUFBPUlQsICZib29sX3ZhbHVlKTsKKworZnJlZV9leGl0OgorICAgIGV6eG1sX2ZyZWUoeG1sX2hlYWQpOworICAgIHJldHVybiByYzsgICAgICAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqIGNwaF9kYl9nZXRfdGNvbnRfc3RhdGUKKyoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQorKioKKyoqIElOUFVUUzoKKyoqICAgdGNvbnQgLSBULUNPTlQKKyoqCisqKiBPVVRQVVRTOgorKiogICBOb25lLiAKKyoqCisqKiBSRVRVUk5TOiAgICAgCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2RiX2dldF90Y29udF9zdGF0ZShVSU5UMzIgdGNvbnQpCit7CisgICAgLyogQ2hlY2sgdGNvbnQgKi8KKyAgICBpZiAodGNvbnQgPj0gTVZfVENPTlRfTExJRF9OVU0pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInRjb250WyVkXSBpcyBpbGxlZ2FsLCBzaG91bGQgYmUgbGVzcyB0aGFuIFslZF1cbiIsIHRjb250LCBNVl9UQ09OVF9MTElEX05VTSk7IAorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIGdfY3BoX2FwcF9kYi50Y29udF9zdGF0ZVt0Y29udF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2RiX3NldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jcGgKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLgorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAorKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3NldF90Y29udF9zdGF0ZShVSU5UMzIgdGNvbnQsIEJPT0wgc3RhdGUpCit7CisgICAgLyogQ2hlY2sgdGNvbnQgKi8KKyAgICBpZiAodGNvbnQgPj0gTVZfVENPTlRfTExJRF9OVU0pCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInRjb250WyVkXSBpcyBpbGxlZ2FsLCBzaG91bGQgYmUgbGVzcyB0aGFuIFslZF1cbiIsIHRjb250LCBNVl9UQ09OVF9MTElEX05VTSk7IAorICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICAvKiBBcHBseSB0LWNvbnQgc3RhdGUgdG8gbXZfY3BoICovCisgICAgZ19jcGhfYXBwX2RiLnRjb250X3N0YXRlW3Rjb250XSA9IHN0YXRlOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgcGFyc2luZyBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZCgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpCit7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiUGFyc2UgZmllbGQoMHgleCk6ICIsIHBhcnNlX2JtKTsgICAgCisKKyAgICAvKiBQcmludCBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0RJUikKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkRpciglcyksICIsIGNwaF9hcHBfbG9va3VwX2RpcihwYXJzZV9rZXktPmRpcikpOworICAgIH0KKworICAgIC8qIFByaW50IFRYL1JYIGRpcmVjdGlvbiAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfUlhfVFgpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJSWC9UWCglcyksICIsIGNwaF9hcHBfbG9va3VwX3J4X3R4KHBhcnNlX2tleS0+ZGlyKSk7CisgICAgfQorCisgICAgLyogUHJpbnQgTWFydmVsbCBoZWFkZXIgKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX01IKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTUgoMHgleCksICIsIHBhcnNlX2tleS0+bWgpOworICAgIH0KKworICAgIC8qIFByaW50IEV0aCB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfVFlQRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkV0aCB0eXBlKDB4JTA0eCksICIsIHBhcnNlX2tleS0+ZXRoX3R5cGUpOworICAgIH0KKworICAgIC8qIFByaW50IEV0aCBzdWJ0eXBlICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FVEhfU1VCVFlQRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkV0aCBzdWJ0eXBlKCVkKSwgIiwgcGFyc2Vfa2V5LT5ldGhfc3VidHlwZSk7CisgICAgfQorCisgICAgLyogUHJpbnQgSVBWNCB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJJUHY0IHR5cGUoJWQpLCAiLCBwYXJzZV9rZXktPmlwdjRfdHlwZSk7CisgICAgfQorCisgICAgLyogUHJpbnQgSVB2NiBOSDEgKi8KKyAgICBpZiAocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lQVjZfTkgxKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiSVB2NiBOSDEoJWQpLCAiLCBwYXJzZV9rZXktPmlwdjZfbmgxKTsKKyAgICB9CisKKyAgICAvKiBQcmludCBJUHY2IE5IMiAqLworICAgIGlmIChwYXJzZV9ibSAmIENQSF9BUFBfUEFSU0VfRklFTERfSVBWNl9OSDIpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJJUHY2IE5IMiglZCksICIsIHBhcnNlX2tleS0+aXB2Nl9uaDIpOworICAgIH0KKworICAgIC8qIFByaW50IElDTVB2NiB0eXBlICovCisgICAgaWYgKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JQ01QVjZfVFlQRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIklDTVB2NiB0eXBlKCVkKSIsIHBhcnNlX2tleS0+aWNtcHY2X3R5cGUpOworICAgIH0KKworICAgIHByaW50ayhLRVJOX0lORk8gIlxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfbW9kX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgbW9kaWZpY2F0aW9uIGZpZWxkCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZCgKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAgbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUpCit7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiTW9kIGZpZWxkKDB4JXgpOiAiLCBtb2RfYm0pOyAgICAKKworICAgIC8qIFByaW50IHByb3RvY29sIHR5cGUgKi8KKyAgICBpZiAobW9kX2JtICYgQ1BIX0FQUF9SWF9NT0RfUkVQTEFDRV9QUk9UT19UWVBFKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUHJvdG8gdHlwZSgweCV4KSwgIiwgbW9kX3ZhbHVlLT5wcm90b190eXBlKTsKKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJzdGF0ZSglcykiLCAobW9kX3ZhbHVlLT5zdGF0ZT09VFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsgIAorCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X2Zyd2RfZmllbGQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGlzcGxheSBDUEggcnVsZSBmb3J3YXJkaW5nIGZpZWxkCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9kaXNwbGF5X2Zyd2RfZmllbGQoCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0sIAorICAgIENQSF9BUFBfRlJXRF9UICAgICAgICpmcndkX3ZhbHVlKQoreworICAgIHByaW50ayhLRVJOX0lORk8gIkZvcndhcmQgZmllbGQoMHgleCk6ICIsIGZyd2RfYm0pOyAgICAKKworICAgIC8qIFByaW50IHRhcmdldCBwb3J0ICovCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX1RSR19QT1JUKQorICAgIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiVGFyZ2V0IHBvcnQoJWQpLCAiLCBmcndkX3ZhbHVlLT50cmdfcG9ydCk7CisgICAgfQorCisgICAgLyogUHJpbnQgdGFyZ2V0IHF1ZXVlICovCisgICAgaWYgKGZyd2RfYm0gJiBDUEhfQVBQX0ZSV0RfU0VUX1RSR19RVUVVRSkKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlRhcmdldCBxdWV1ZSglZCksICIsIGZyd2RfdmFsdWUtPnRyZ19xdWV1ZSk7CisgICAgfQorCisgICAgLyogUHJpbnQgR0VNIHBvcnQgKi8KKyAgICBpZiAoZnJ3ZF9ibSAmIENQSF9BUFBfRlJXRF9TRVRfR0VNX1BPUlQpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJHZW0gcG9ydCglZCkiLCBmcndkX3ZhbHVlLT5nZW1fcG9ydCk7CisgICAgfSAgICAKKworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsgIAorCisgICAgcmV0dXJuIE1WX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2Rpc3BsYXlfYWxsKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgYWxsIENQSCBydWxlcyBpbiBkYXRhIGJhc2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfYWxsKFZPSUQpCit7CisgICAgQ1BIX0FQUF9SVUxFX1QgKnBfY3BoX3J1bGUgPSBOVUxMOworICAgIFVJTlQzMiAgICAgICAgICBpZHggICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgcnVsZV9pZHggICA9IDA7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJDUEggQXBwbGljYXRpb24gRGF0YSBCYXNlLCB0b3RhbCBydWxlIG51bWJlclsldV1cbiIsIGdfY3BoX2FwcF9kYi5ydWxlX251bSk7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJUUE0gY29tcGxleCBwcm9maWxlOiAlcywgYWN0aXZlIFdBTjogJXNcbiIsIAorICAgICAgICAgICBjcGhfYXBwX2xvb2t1cF9wcm9maWxlX2lkKGdfY3BoX2FwcF9kYi5wcm9maWxlX2lkKSwgCisgICAgICAgICAgIGNwaF9hcHBfbG9va3VwX2dtYWMoZ19jcGhfYXBwX2RiLmFjdGl2ZV9wb3J0KSk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJHZW5lcmljIGFwcGxpY2F0aW9uIGhhbmRsaW5nIHN1cHBwb3J0OiAlc1xuIiwgCisgICAgICAgKGdfY3BoX2FwcF9kYi5hcHBfc3VwcG9ydCA9PSBUUlVFKT8iRW5hYmxlZCI6IkRpc2FibGVkIik7CisgICAgCisjaWZkZWYgQ09ORklHX01WX0NQSF9JR01QX0hBTkRMRQorICAgIHByaW50ayhLRVJOX0lORk8gIklHTVAvTUxEIGhhbmRsaW5nIHN1cHBwb3J0OiAlc1xuIiwgCisgICAgICAgICAgIChnX2NwaF9hcHBfZGIuaWdtcF9zdXBwb3J0ID09IFRSVUUpPyJFbmFibGVkIjoiRGlzYWJsZWQiKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9CQ19IQU5ETEUgIAorICAgIHByaW50ayhLRVJOX0lORk8gIkJyb2FkY2FzdCBoYW5kbGluZyBzdXBwcG9ydDogJXNcbiIsIAorICAgICAgICAgICAoZ19jcGhfYXBwX2RiLmJjX3N1cHBvcnQgPT0gVFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRSAgIAorICAgIHByaW50ayhLRVJOX0lORk8gIkRhdGEgZmxvdyBtYXBwaW5nL21vZGlmaWNhdGlvbiBzdXBwcG9ydDogJXNcbiIsICAgICAKKyAgICAgICAgICAgKGdfY3BoX2FwcF9kYi5mbG93X3N1cHBvcnQgPT0gVFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiVURQIHBvcnQgbWFwcGluZyBzdXBwcG9ydDogJXNcbiIsCisgICAgICAgICAgIChnX2NwaF9hcHBfZGIudWRwX3N1cHBvcnQgPT0gVFJVRSk/IkVuYWJsZWQiOiJEaXNhYmxlZCIpOworI2VuZGlmCisKKyAgICBwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAKKyAgICBwcmludGsoS0VSTl9JTkZPICJDUEggdG90YWwgcnVsZSBudW1iZXI6ICVkXG4iLCBnX2NwaF9hcHBfZGIucnVsZV9udW0pOyAgICAKKworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0FQUF9NQVhfUlVMRV9OVU0pICYmIChydWxlX2lkeCA8IGdfY3BoX2FwcF9kYi5ydWxlX251bSk7IGlkeCsrKQorICAgIHsKKyAgICAgICAgcF9jcGhfcnVsZSA9ICZnX2NwaF9hcHBfZGIuY3BoX3J1bGVbaWR4XTsKKyAgICAgICAgaWYgKHBfY3BoX3J1bGUtPnZhbGlkID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bGVfaWR4Kys7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNQSCBydWxlOiAjJWRcbiIsIHJ1bGVfaWR4KTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKHBfY3BoX3J1bGUtPnBhcnNlX2JtLCAmcF9jcGhfcnVsZS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZChwX2NwaF9ydWxlLT5tb2RfYm0sICAgICAmcF9jcGhfcnVsZS0+bW9kX3ZhbHVlKTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X2Zyd2RfZmllbGQocF9jcGhfcnVsZS0+ZnJ3ZF9ibSwgICAmcF9jcGhfcnVsZS0+ZnJ3ZF92YWx1ZSk7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJDb3VudGVyOiAlZFxuXG4iLCBwX2NwaF9ydWxlLT5jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGsoS0VSTl9JTkZPICJNaXMtbWF0Y2hlZCBvciBicm9hZGNhc3QgY291bnRlcjogJWRcbiIsIGdfY3BoX2FwcF9kYi5iY19jb3VudCk7ICAgIAorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiVC1DT05UIFN0YXRlXG4iKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1WX1RDT05UX0xMSURfTlVNOyBpZHgrKykKKyAgICB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlQtQ09OVFslZF06ICVzXG4iLCBpZHgsIChnX2NwaF9hcHBfZGIudGNvbnRfc3RhdGVbaWR4XSA9PSBUUlVFKT8iVFJVRSI6IkZBTFNFIik7CisgICAgfQorCisgICAgcmV0dXJuIE1WX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggZGF0YSBiYXNlIAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5pdChWT0lEKQoreworICAgIFVJTlQzMiAgICBpZHggPSAwOworICAgIE1WX1NUQVRVUyByYyAgPSBNVl9PSzsKKworICAgIG1lbXNldCgmZ19jcGhfYXBwX2RiLCAwLCBzaXplb2YoZ19jcGhfYXBwX2RiKSk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfQVBQX01BWF9SVUxFX05VTTsgaWR4KyspCisgICAgICAgIGdfY3BoX2FwcF9kYi5jcGhfcnVsZVtpZHhdLnZhbGlkID0gRkFMU0U7CisKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgKi8KKyAgICBnX2NwaF9hcHBfZGIucHJvZmlsZV9pZCAgID0gVFBNX1BPTl9XQU5fRFVBTF9NQUNfSU5UX1NXSVRDSDsKKyAgICBnX2NwaF9hcHBfZGIuYWN0aXZlX3BvcnQgID0gTVZfQVBQX1BPTl9NQUNfUE9SVDsKKyAgICBnX2NwaF9hcHBfZGIuYXBwX3N1cHBvcnQgID0gVFJVRTsKKyAgICBnX2NwaF9hcHBfZGIuaWdtcF9zdXBwb3J0ID0gRkFMU0U7CisgICAgZ19jcGhfYXBwX2RiLmJjX3N1cHBvcnQgICA9IEZBTFNFOworICAgIGdfY3BoX2FwcF9kYi5mbG93X3N1cHBvcnQgPSBGQUxTRTsKKyAgICBnX2NwaF9hcHBfZGIudWRwX3N1cHBvcnQgID0gRkFMU0U7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1WX1RDT05UX0xMSURfTlVNOyBpZHgrKykKKyAgICAgICAgZ19jcGhfYXBwX2RiLnRjb250X3N0YXRlW2lkeF0gPSBGQUxTRTsKKworICAgIC8qIEluaXQgc3BpbiBsb2NrICovCisgICAgc3Bpbl9sb2NrX2luaXQoJmdfY3BoX2FwcF9kYi5hcHBfbG9jayk7CisKKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9kYi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxOTAzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGIuaApAQCAtMCwwICsxLDUzMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9kYi5oCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGRhdGEgYmFzZSBpbXBsZW1lbnRhdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfREJfSF8KKyNkZWZpbmUgX01WX0NQSF9EQl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERhdGEgdHlwZSBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVU19DUEhfWE1MX0NGR19GSUxFICAgICAgICAgICIvZXRjL3htbF9wYXJhbXMvY3BoX3htbF9jZmdfZmlsZS54bWwiCisjZGVmaW5lIFVTX09OVV9QUk9GSUxFX1hNTF9DRkdfRklMRSAgIi9ldGMveG1sX3BhcmFtcy9vbnVfcHJvZmlsZV94bWxfY2ZnX2ZpbGUueG1sIgorCisjZGVmaW5lIFhNTF9QUk9GSUxFX0VMTV9DQVBBQklMSVRZICAgIkNhcGFiaWxpdHkiCisjZGVmaW5lIFhNTF9QUk9GSUxFX0VMTV9BVFRSSUIgICAgICAgImF0dHJpYiIKKyNkZWZpbmUgWE1MX1BST0ZJTEVfQVRUUl9OQU1FICAgICAgICAibmFtZSIKKyNkZWZpbmUgWE1MX1BST0ZJTEVfQVRUUl9WQUxVRSAgICAgICAidmFsdWUiCisjZGVmaW5lIFhNTF9QUk9GSUxFX05BTUVfUFJPRklMRSAgICAgIkNvbXBsZXggcHJvZmlsZSIKKyNkZWZpbmUgWE1MX1BST0ZJTEVfTkFNRV9BQ1RJVkVfUE9SVCAiQWN0aXZlIHdhbiIKKworI2RlZmluZSBYTUxfQ1BIX0VMTV9BUFBfU1VQUE9SVCAgICAgICJhcHBfc3VwcG9ydCIKKyNkZWZpbmUgWE1MX0NQSF9FTE1fSUdNUF9TVVBQT1JUICAgICAiaWdtcF9zdXBwb3J0IgorI2RlZmluZSBYTUxfQ1BIX0VMTV9CQ19TVVBQT1JUICAgICAgICJiY19zdXBwb3J0IgorI2RlZmluZSBYTUxfQ1BIX0VMTV9GTE9XX1NVUFBPUlQgICAgICJmbG93X3N1cHBvcnQiCisjZGVmaW5lIFhNTF9DUEhfRUxNX1VEUF9TVVBQT1JUICAgICAgInVkcF9zdXBwb3J0IgorCisKKy8qIENQSCBydWxlIGRlZmluaXRpb24gZm9yIGFwcGxpY2F0aW9uIHBhY2tldCBoYW5kbGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgIHZhbGlkOworICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibTsKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgcGFyc2Vfa2V5OworICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm07CisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibTsKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKKyAgICBVSU5UMzIgICAgICAgICAgICAgICAgY291bnQ7IAorfSBDUEhfQVBQX1JVTEVfVDsKKworLyogQ1BIIGRhdGEgYmFzZSBmb3IgYXBwbGljYXRpb24gcGFja2V0IGhhbmRsaW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBDUEhfQVBQX01BWF9SVUxFX05VTSAgKDY0KQordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90ICBwcm9maWxlX2lkOyAgICAgICAvKiBDb21wbGV4IHByb2ZpbGUgSUQsIHNlZSB0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90ICAqLworICAgIE1WX0FQUF9HTUFDX1BPUlRfRSAgICAgICAgIGFjdGl2ZV9wb3J0OyAgICAgIC8qIEN1cnJlbnQgYWN0aXZlIFdBTiBHRSBwb3J0LCBzZWUgTVZfQVBQX0dNQUNfUE9SVF9FICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgYXBwX3N1cHBvcnQ7ICAgICAgLyogV2hldGhlciBzdXBwb3J0IGdlbmVyaWMgYXBwbGljYXRpb24gaGFuZGxpbmcgICAgICAgKi8KKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICBpZ21wX3N1cHBvcnQ7ICAgICAvKiBXaGV0aGVyIHN1cHBvcnQgSUdNUC9NTEQgcGFja2V0IGhhbmRsaW5nICAgICAgICAgICAqLworICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgIGJjX3N1cHBvcnQ7ICAgICAgIC8qIFdoZXRoZXIgc3VwcG9ydCBVL1MgYnJvYWRjYXN0IHBhY2tldCBoYW5kbGluZyAgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgZmxvd19zdXBwb3J0OyAgICAgLyogV2hldGhlciBzdXBwb3J0IGZsb3cgbWFwcGluZyBoYW5kbGluZyBpbiBDUEggICAgICAgKi8KKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgICB1ZHBfc3VwcG9ydDsgICAgICAvKiBXaGV0aGVyIHN1cHBvcnQgVURQIHBvcnQgbWFwcGluZyBpbiBDUEggICAgICAgICAgICAqLworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIHJ1bGVfbnVtOyAgICAgICAgIC8qIEN1cnJlbnQgYXBwbGljYXRpb24gcnVsZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICovCisgICAgQ1BIX0FQUF9SVUxFX1QgICAgICAgICAgICAgY3BoX3J1bGVbQ1BIX0FQUF9NQVhfUlVMRV9OVU1dOyAvKiBDUEggYXBwbGljYXRpb24gcnVsZXMgICAgICAgICAgICAgICAgKi8KKyAgICBzcGlubG9ja190ICAgICAgICAgICAgICAgICBhcHBfbG9jazsgICAgICAgICAvKiBTcGluIGxvY2sgZm9yIGFwcGxpY2F0aW9uIHJ1bGUgb3BlcmF0aW9uICAgICAgICAgICAqLworICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgIGJjX2NvdW50OyAgICAgICAgIC8qIENvdW50ZXIgZm9yIG1pcy1tYXRjaGVkIHBhY2tldHMsIHVzdWFsbHkgaXMgYmMgICAgICovCisgICAgQk9PTCAgICAgICAgICAgICAgICAgICAgICAgdGNvbnRfc3RhdGVbTVZfVENPTlRfTExJRF9OVU1dOy8qIFQtQ09OVCBzdGF0ZSB1c2VkIHRvIGNvbnRyb2wgU1dGICAgICAgKi8KK30gQ1BIX0FQUF9EQl9UOworCisvKiBDUEggZGF0YWJhc2UgcGFyYW1ldGVyIGVudW0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfREJfUEFSQU1fUFJPRklMRV9JRCA9IDAsCisgICAgQ1BIX0RCX1BBUkFNX0FDVElWRV9QT1JULAorICAgIENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVCwgICAgCisgICAgQ1BIX0RCX1BBUkFNX0lHTVBfU1VQUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fQkNfU1VQUE9SVCwKKyAgICBDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JULAorICAgIENQSF9EQl9QQVJBTV9VRFBfU1VQUE9SVCwgICAgCisgICAgQ1BIX0RCX1BBUkFNX0JDX0NPVU5URVIKK30gQ1BIX0RCX1BBUkFNX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfc2V0X3BhcmFtKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldCBDUEggREIgcGFyYW1ldGVyCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyYW0gICAtIFRoZSBwYXJhbWV0ZXIgdHlwZQorKiAgICAgICB2YWx1ZSAgIC0gUGFyYW1ldGVyIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfc2V0X3BhcmFtIChDUEhfREJfUEFSQU1fRSBwYXJhbSwgVk9JRCAqdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfcGFyYW0oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0IENQSCBEQiBwYXJhbWV0ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJhbSAgIC0gVGhlIHBhcmFtZXRlciB0eXBlCisqCisqIE9VVFBVVFM6CisqICAgICAgIHZhbHVlICAgLSBQYXJhbWV0ZXIgdmFsdWUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9nZXRfcGFyYW0gKENQSF9EQl9QQVJBTV9FIHBhcmFtLCBWT0lEICp2YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2FkZF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgQ1BIIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9hZGRfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2RlbF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGVzIENQSCBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGVsX2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX3VwZGF0ZV9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgQ1BIIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl91cGRhdGVfYXBwX3J1bGUgKAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSwKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5LAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0sCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgKm1vZF92YWx1ZSwKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibSwKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2RiX2dldF9hcHBfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgQ1BIIHJ1bGUgCisqCisqIElOUFVUUzoKKyogICAgICAgcGFyc2VfYm0gICAtIFBhcnNpbmcgYml0bWFwCisqICAgICAgIHBhcnNlX2tleSAgLSBQYXJzaW5nIGtleQorKgorKiBPVVRQVVRTOgorKiAgICAgICBtb2RfYm0gICAgIC0gTW9kaWZpY2F0aW9uIGJpdG1hcAorKiAgICAgICBtb2RfdmFsdWUgIC0gTW9kaWZpY2F0aW9uIHZhbHVlCisqICAgICAgIGZyd2RfYm0gICAgLSBGb3J3YXJkaW5nIGJpdG1hcAorKiAgICAgICBmcndkX3ZhbHVlIC0gRm9yd2FyZGluZyB2YWx1ZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4KKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X2FwcF9ydWxlICgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgKnBhcnNlX2tleSwKKyAgICBDUEhfQVBQX01PRF9GSUVMRF9FICAqbW9kX2JtLAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICptb2RfdmFsdWUsCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgKmZyd2RfYm0sCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9nZXRfYXBwX3J1bGVfYnlfZGlyX3Byb3RvKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBhcHBsaWNhdGlvbiB0eXBlIENQSCBydWxlIGZyb20gZGF0YSBiYXNlIGJ5IHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqICAgICAgIG1vZF9ibSAgICAgLSBNb2RpZmljYXRpb24gYml0bWFwCisqICAgICAgIG1vZF92YWx1ZSAgLSBNb2RpZmljYXRpb24gdmFsdWUKKyogICAgICAgZnJ3ZF9ibSAgICAtIEZvcndhcmRpbmcgYml0bWFwCisqICAgICAgIGZyd2RfdmFsdWUgLSBGb3J3YXJkaW5nIHZhbHVlCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZ2V0X2FwcF9ydWxlX2J5X2Rpcl9wcm90byAoCisgICAgQ1BIX0RJUl9FICAgICAgICAgICAgICBkaXIsCisgICAgVUlOVDE2ICAgICAgICAgICAgICAgICBwcm90b190eXBlLAorICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSAqcGFyc2VfYm0sCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgICpwYXJzZV9rZXksICAgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICAqbW9kX2JtLCAKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAgKm1vZF92YWx1ZSwgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgICpmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgKmZyd2RfdmFsdWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbmNyZWFzZV9jb3VudGVyKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluY3JlYXNlIFJYIGNvdW50ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ibSAgIC0gUGFyc2luZyBiaXRtYXAKKyogICAgICAgcGFyc2Vfa2V5ICAtIFBhcnNpbmcga2V5CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfaW5jcmVhc2VfY291bnRlciAoCisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtLCAKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAqcGFyc2Vfa2V5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogIEluY3JlYXNlIFJYIGNvdW50ZXIgYWNjb3JkaW5nIHRvIHByb3RvY29sIHR5cGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBkaXIgICAgICAgIC0gRGlyZWN0aW9uCisqICAgICAgIHByb3RvX3R5cGUgLSBTS0IgcHJvdG9jb2wgdHlwZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2luY3JlYXNlX2NvdW50ZXJfYnlfZGlyX3Byb3RvIChDUEhfRElSX0UgZGlyLAorICAgIFVJTlQxNiAgICBwcm90b190eXBlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZ2V0X3htbF9wYXJhbSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBHZXQgdGhlIFhNTCBwYXJhbWV0ZXIKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2dldF94bWxfcGFyYW0oVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2RiX2dldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCisqKgorKiogSU5QVVRTOgorKiogICB0Y29udCAtIFQtQ09OVAorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlKFVJTlQzMiB0Y29udCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogY3BoX2RiX3NldF90Y29udF9zdGF0ZQorKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jcGgKKyoqCisqKiBJTlBVVFM6CisqKiAgIHRjb250IC0gVC1DT05UCisqKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLgorKioKKyoqIE9VVFBVVFM6CisqKiAgIE5vbmUuIAorKioKKyoqIFJFVFVSTlM6ICAgICAKKyoqICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAorKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX3NldF90Y29udF9zdGF0ZShVSU5UMzIgdGNvbnQsIEJPT0wgc3RhdGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgcGFyc2luZyBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9wYXJzZV9maWVsZCgKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm0sIAorICAgIENQSF9BUFBfUEFSU0VfVCAgICAgICpwYXJzZV9rZXkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEaXNwbGF5IENQSCBydWxlIG1vZGlmaWNhdGlvbiBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9tb2RfZmllbGQoCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSwKKyAgICBDUEhfQVBQX01PRF9UICAgICAgICAqbW9kX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgQ1BIIHJ1bGUgZm9yd2FyZGluZyBmaWVsZAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtLCAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAqZnJ3ZF92YWx1ZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGJfZGlzcGxheV9hbGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGlzcGxheSBDUEggZGF0YSBiYXNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2RiX2Rpc3BsYXlfYWxsKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGRhdGEgYmFzZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLgorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9kYl9pbml0KFZPSUQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9EQl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjNjg1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGV2LmMKQEAgLTAsMCArMSw0NTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZGV2LmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgY2hhciBkZXZpY2UgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworCisvKiBVc2VkIHRvIHByZXZlbnQgbXVsdGlwbGUgYWNjZXNzIHRvIGRldmljZSAqLworc3RhdGljIGludCAgICAgICAgICAgICAgIGdfY3BoX2RldmljZV9vcGVuID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBnX2NwaF9taXNjX2RldjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X29wZW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGRldmljZSBvcGVuIGFjdGlvbnMKKyoKKyogSU5QVVRTOgorKiAgICAgICBpbm9kZSAtIERldmljZSBpbm9kZSBwb2ludGVyLgorKiAgICAgICBmaWxlICAtIEZpbGUgaGFuZGxlci4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVDMyIGNwaF9kZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiRW50ZXJcbiIpOworCisjaWYgMAorICAgIGlmIChnX2NwaF9kZXZpY2Vfb3BlbiA+IDApCisgICAgICAgIHJldHVybiAtRUJVU1k7CisjZW5kaWYKKworICAgIGdfY3BoX2RldmljZV9vcGVuKys7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9yZWxlYXNlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBleGVjdXRlcyBkZXZpY2UgcmVsZWFzZSBhY3Rpb25zCisqCisqIElOUFVUUzoKKyogICAgICAgaW5vZGUgLSBEZXZpY2UgaW5vZGUgcG9pbnRlci4KKyogICAgICAgZmlsZSAgLSBGaWxlIGhhbmRsZXIuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworI2lmIDAKKyAgICBpZiAoY3BoX2RldmljZV9vcGVuID4gMCkKKyAgICAgICAgY3BoX2RldmljZV9vcGVuLS07CisjZW5kaWYKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9pb2N0bCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZXMgaW9jdGwgY29tbWFuZHMKKyoKKyogSU5QVVRTOgorKiAgICAgICBpbm9kZSAtIERldmljZSBpbm9kZSBwb2ludGVyLgorKiAgICAgICBmaWxlICAtIEZpbGUgaGFuZGxlci4KKyogICAgICAgY21kICAgLSBDb21tYW5kLgorKiAgICAgICBhcmcgICAtIFBvbnRlciB0byBhcmcuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBVSU5UMzIgY21kLCBVTE9ORyBhcmcpCit7CisgICAgQ1BIX0lPQ1RMX0FQUF9SVUxFX1QgICAgY3BoX2FwcF9ydWxlOworICAgIENQSF9JT0NUTF9GTE9XX01BUF9UICAgIGNwaF9mbG93X21hcDsKKyAgICBDUEhfSU9DVExfRFNDUF9NQVBfVCAgICBjcGhfZHNjcF9tYXA7CisgICAgQ1BIX0lPQ1RMX01JU0NfVCAgICAgICAgY3BoX21pc2M7CisgICAgQ1BIX0lPQ1RMX1RDT05UX1NUQVRFX1QgY3BoX3Rjb250OworICAgIElOVDMyICAgICAgICAgICAgICAgICAgIHJjICA9IC1FSU5WQUw7CisKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiRW50ZXJcbiIpOworCisgICAgc3dpdGNoIChjbWQpCisgICAgeworICAgICAgICAvKiBDUEggYXBwbGljYXRpb24gcGFja2V0IGhhbmRsaW5nIElPQ1RMCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9TRVRfQ09NUExFWF9QUk9GSUxFOiAgICAgICAgCisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX21pc2MsIChDUEhfSU9DVExfTUlTQ19UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX01JU0NfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZShjcGhfbWlzYy5wcm9maWxlX2lkLCBjcGhfbWlzYy5hY3RpdmVfcG9ydCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9TRVRfRkVBVFVSRV9GTEFHOiAgICAgICAgCisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX21pc2MsIChDUEhfSU9DVExfTUlTQ19UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX01JU0NfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfc2V0X2ZlYXR1cmVfZmxhZyhjcGhfbWlzYy5mZWF0dXJlX3R5cGUsIGNwaF9taXNjLmZlYXR1cmVfZmxhZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfQVBQX0FERF9SVUxFOiAgICAgICAgCisgICAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3BoX2FwcF9ydWxlLCAoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QgKilhcmcsIHNpemVvZihDUEhfSU9DVExfQVBQX1JVTEVfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfYWRkX2FwcF9ydWxlKGNwaF9hcHBfcnVsZS5wYXJzZV9ibSwgJmNwaF9hcHBfcnVsZS5wYXJzZV9rZXksIGNwaF9hcHBfcnVsZS5tb2RfYm0sICZjcGhfYXBwX3J1bGUubW9kX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGhfYXBwX3J1bGUuZnJ3ZF9ibSwgJmNwaF9hcHBfcnVsZS5mcndkX3ZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0FQUF9ERUxfUlVMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9hcHBfcnVsZSwgKENQSF9JT0NUTF9BUFBfUlVMRV9UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX2RlbF9hcHBfcnVsZShjcGhfYXBwX3J1bGUucGFyc2VfYm0sICZjcGhfYXBwX3J1bGUucGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0FQUF9VUERBVEVfUlVMRTogICAgICAgIAorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9hcHBfcnVsZSwgKENQSF9JT0NUTF9BUFBfUlVMRV9UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX0FQUF9SVUxFX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3VwZGF0ZV9hcHBfcnVsZShjcGhfYXBwX3J1bGUucGFyc2VfYm0sICZjcGhfYXBwX3J1bGUucGFyc2Vfa2V5LCBjcGhfYXBwX3J1bGUubW9kX2JtLCAmY3BoX2FwcF9ydWxlLm1vZF92YWx1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BoX2FwcF9ydWxlLmZyd2RfYm0sICZjcGhfYXBwX3J1bGUuZnJ3ZF92YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9BUFBfR0VUX1JVTEU6ICAgICAgICAKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfYXBwX3J1bGUsIChDUEhfSU9DVExfQVBQX1JVTEVfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9BUFBfUlVMRV9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9nZXRfYXBwX3J1bGUoY3BoX2FwcF9ydWxlLnBhcnNlX2JtLCAmY3BoX2FwcF9ydWxlLnBhcnNlX2tleSwgJmNwaF9hcHBfcnVsZS5tb2RfYm0sICZjcGhfYXBwX3J1bGUubW9kX3ZhbHVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BoX2FwcF9ydWxlLmZyd2RfYm0sICZjcGhfYXBwX3J1bGUuZnJ3ZF92YWx1ZSk7CisKKyAgICAgICAgICAgIGlmKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworCisgICAgICAgICAgICBpZihjb3B5X3RvX3VzZXIoKENQSF9JT0NUTF9BUFBfUlVMRV9UKilhcmcsICZjcGhfYXBwX3J1bGUsIHNpemVvZihDUEhfSU9DVExfQVBQX1JVTEVfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV90b191c2VyIGZhaWxlZFxuIik7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgLyogQ1BIIGZsb3cgbWFwcGluZyBJT0NUTAorICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfRkxPV19BRERfUlVMRToKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZmxvd19tYXAsIChDUEhfSU9DVExfRkxPV19NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9hZGRfZmxvd19ydWxlKCZjcGhfZmxvd19tYXAuZmxvd19tYXApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfRkxPV19ERUxfUlVMRToKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZmxvd19tYXAsIChDUEhfSU9DVExfRkxPV19NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9kZWxfZmxvd19ydWxlKCZjcGhfZmxvd19tYXAuZmxvd19tYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfRkxPV19HRVRfUlVMRToKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZmxvd19tYXAsIChDUEhfSU9DVExfRkxPV19NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHJjID0gY3BoX2dldF9mbG93X3J1bGUoJmNwaF9mbG93X21hcC5mbG93X21hcCk7CisgICAgICAgIAorICAgICAgICAgICAgaWYocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgIAorICAgICAgICAgICAgaWYoY29weV90b191c2VyKChDUEhfSU9DVExfRkxPV19NQVBfVCopYXJnLCAmY3BoX2Zsb3dfbWFwLCBzaXplb2YoQ1BIX0lPQ1RMX0ZMT1dfTUFQX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfSAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfQ0xFQVJfUlVMRToKKyAgICAgICAgICAgIHJjID0gY3BoX2NsZWFyX2Zsb3dfcnVsZSgpOworICAgICAgICAgICAgYnJlYWs7IAorCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfQ0xFQVJfUlVMRV9CWV9NSDoKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfZmxvd19tYXAsIChDUEhfSU9DVExfRkxPV19NQVBfVCAqKWFyZywgc2l6ZW9mKENQSF9JT0NUTF9GTE9XX01BUF9UKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gaW9jdGxfZXJyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNwaF9jbGVhcl9mbG93X3J1bGVfYnlfbWgoY3BoX2Zsb3dfbWFwLmZsb3dfbWFwLm1oKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTVZfQ1BIX0lPQ1RMX0ZMT1dfU0VUX0RTQ1BfTUFQOgorICAgICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmNwaF9kc2NwX21hcCwgKENQSF9JT0NUTF9EU0NQX01BUF9UICopYXJnLCBzaXplb2YoQ1BIX0lPQ1RMX0RTQ1BfTUFQX1QpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBpb2N0bF9lcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gY3BoX3NldF9mbG93X2RzY3BfbWFwKCZjcGhfZHNjcF9tYXAuZHNjcF9tYXApOworICAgICAgICAgICAgYnJlYWs7ICAKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9GTE9XX0RFTF9EU0NQX01BUDoKKyAgICAgICAgICAgIHJjID0gY3BoX2RlbF9mbG93X2RzY3BfbWFwKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1WX0NQSF9JT0NUTF9TRVRfVENPTlRfTExJRF9TVEFURToKKyAgICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjcGhfdGNvbnQsIChVSU5UMzIgKilhcmcsIHNpemVvZihDUEhfSU9DVExfVENPTlRfU1RBVEVfVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGlvY3RsX2VycjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBjcGhfc2V0X3Rjb250X3N0YXRlKGNwaF90Y29udC50Y29udCwgY3BoX3Rjb250LnN0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOyAgCisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBNVl9DUEhfSU9DVExfU0VUVVA6CisgICAgICAgICAgICByYyA9IGNwaF9kZXZfc2V0dXAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmMgPSAtRUlOVkFMOworICAgIH0KKworaW9jdGxfZXJyOgorICAgIHJldHVybihyYyk7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ19jcGhfZGV2X2ZvcHMgPSAKK3sKKyAgICAub3BlbiAgICA9IGNwaF9kZXZfb3BlbiwKKyAgICAucmVsZWFzZSA9IGNwaF9kZXZfcmVsZWFzZSwKKyAgICAuaW9jdGwgICA9IGNwaF9kZXZfaW9jdGwsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2V0dXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2V0dXAgZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Rldl9zZXR1cChWT0lEKQoreworICAgIE1WX1NUQVRVUyByYyAgPSBNVl9PSzsKKworICAgIC8qIEdldCBwYXJhbWV0ZXIgZnJvbSBYTUwgZmlsZSAqLworICAgIHJjID0gY3BoX2RiX2dldF94bWxfcGFyYW0oKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJmYWlsIHRvIGNhbGwgY3BoX2RiX2dldF94bWxfcGFyYW0iKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZGV2X2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Rldl9pbml0KFZPSUQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIGdfY3BoX21pc2NfZGV2Lm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOworICAgIGdfY3BoX21pc2NfZGV2Lm5hbWUgID0gTVZfQ1BIX0RFVklDRV9OQU1FOworICAgIGdfY3BoX21pc2NfZGV2LmZvcHMgID0gJmdfY3BoX2Rldl9mb3BzOworCisgICAgcmMgPSBtaXNjX3JlZ2lzdGVyKCZnX2NwaF9taXNjX2Rldik7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIG1pc2NfcmVnaXN0ZXIiKTsKKworICAgIHJjID0gY3BoX25ldGRldl9pbml0KCk7CisgICAgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJjLCAiZmFpbCB0byBjYWxsIGNwaF9uZXRkZXZfaW5pdCIpOworCisgICAgcmMgPSBjcGhfc3lzZnNfaW5pdCgpOworICAgIENIRUNLX0FQSV9SRVRVUk5fQU5EX0xPR19FUlJPUihyYywgImZhaWwgdG8gY2FsbCBjcGhfc3lzZnNfaW5pdCIpOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiQ1BIOiBtaXNjIGRldmljZSAlcyByZWdpc3RlcmVkIHdpdGggbWlub3I6ICVkXG4iLCBNVl9DUEhfREVWSUNFX05BTUUsIGdfY3BoX21pc2NfZGV2Lm1pbm9yKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9zaHV0ZG93bigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTaHV0ZG93biBDUEggZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIGNwaF9kZXZfc2h1dGRvd24oVk9JRCkKK3sKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiRW50ZXJcbiIpOworCisgICAgY3BoX3N5c2ZzX2V4aXQoKTsKKworICAgIG1pc2NfZGVyZWdpc3RlcigmZ19jcGhfbWlzY19kZXYpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc4NDRjODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZGV2LmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZGV2LmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgY2hhciBkZXZpY2UgZGVmaW5pdGlvbgorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfREVWX0hfCisjZGVmaW5lIF9NVl9DUEhfREVWX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIE1WX0NQSF9ERVZJQ0VfTkFNRSAgImNwaCIKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX01BR0lDICAoJ0MnKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWNsYXJhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9zZXR1cCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXR1cCBkZXZpY2UKKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZGV2X3NldHVwKFZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kZXZfc2h1dGRvd24oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9kZXZfaW5pdCAoVk9JRCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Rldl9zaHV0ZG93bigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTaHV0ZG93biBDUEggZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEICAgY3BoX2Rldl9zaHV0ZG93biAoVk9JRCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfREVWX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZmxvdy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWUyMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuYwpAQCAtMCwwICsxLDE4NjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfZmxvdy5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIGZsb3cgbW9kdWxlIHRvIGhhbmRsZSB0aGUgCisqICAgICAgICAgICAgICBmbG93IG1hcHBpbmcsIFZMQU4gbW9kaWZpY2F0aW9uIG9mIGRhdGEgdHJhZmZpYworKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMTJEZWMyMDExCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjEKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKyNpbmNsdWRlICJtdl9jcGhfaGVhZGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX0ZMT1dfVEFCTEVfVCBnc19mbG93X3RhYmxlOworc3RhdGljIENQSF9EU0NQX1BCSVRTX1QgZ3NfZHNjcF9tYXBfdGFibGU7CisKK3N0YXRpYyBNVl9FTlVNX0VOVFJZX1QgZ19lbnVtX21hcF9vcF90eXBlW10gPQoreworICAgIHsgQ1BIX1ZMQU5fT1BfQVNJUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVNJUyJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfRElTQ0FSRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAiRElTQ0FSRCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUREIn0sCisgICAgeyBDUEhfVkxBTl9PUF9BRERfQ09QWV9EU0NQLCAgICAgICAgICAgICAgICAgICAgICJBRERfQ09QWV9EU0NQIn0sCisgICAgeyBDUEhfVkxBTl9PUF9BRERfQ09QWV9PVVRFUl9QQklULCAgICAgICAgICAgICAgICJBRERfQ09QWV9PVVRFUl9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9BRERfQ09QWV9JTk5FUl9QQklULCAgICAgICAgICAgICAgICJBRERfQ09QWV9JTk5FUl9QQklUIn0sCisgICAgeyBDUEhfVkxBTl9PUF9BRERfMl9UQUdTLCAgICAgICAgICAgICAgICAgICAgICAgICJBRERfMl9UQUdTIn0sCisgICAgeyBDUEhfVkxBTl9PUF9BRERfMl9UQUdTX0NPUFlfRFNDUCwgICAgICAgICAgICAgICJBRERfMl9UQUdTX0NPUFlfRFNDUCJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX1BCSVQsICAgICAgICAgICAgICAiQUREXzJfVEFHU19DT1BZX1BCSVQifSwKKyAgICB7IENQSF9WTEFOX09QX1JFTSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFTSJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVNXzJfVEFHUywgICAgICAgICAgICAgICAgICAgICAgICAiUkVNXzJfVEFHUyJ9LAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVQTEFDRSJ9LCAgICAKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0VfVklELCAgICAgICAgICAgICAgICAgICAgICAgIlJFUExBQ0VfVklEIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX1BCSVQsICAgICAgICAgICAgICAgICAgICAgICJSRVBMQUNFX1BCSVQifSwKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfQUREX09VVEVSLCAgICAgICAgICAgIlJFUExBQ0VfSU5ORVJfQUREX09VVEVSIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUl9DT1BZX1BCSVQsICJSRVBMQUNFX0lOTkVSX0FERF9PVVRFUl9DT1BZX1BCSVQifSwKKyAgICB7IENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfUkVNX09VVEVSLCAgICAgICAgICAgIlJFUExBQ0VfSU5ORVJfUkVNX09VVEVSIn0sCisgICAgeyBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTLCAgICAgICAgICAgICAgICAgICAgICJSRVBMQUNFXzJUQUdTIn0sICAgIAorICAgIHsgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHU19WSUQsICAgICAgICAgICAgICAgICAiUkVQTEFDRV8yVEFHU19WSUQifSwKKyAgICB7IENQSF9WTEFOX09QX1NXQVAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNXQVAifSAgICAKK307CisKK3N0YXRpYyBNVl9FTlVNX0FSUkFZX1QgZ19lbnVtX2FycmF5X29wX3R5cGUgPQoreworICAgIHNpemVvZihnX2VudW1fbWFwX29wX3R5cGUpL3NpemVvZihnX2VudW1fbWFwX29wX3R5cGVbMF0pLAorICAgIGdfZW51bV9tYXBfb3BfdHlwZQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBEZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RiX2dldF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldCBDUEggZmxvdyBtYXBwaW5nIHJ1bGUuCisqCisqIElOUFVUUzoKKyogICAgICAgZmxvdyAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgZm9yX3BhY2tldCAtIFdoZXRoZXIgZ2V0IHJ1bGUgZm9yIHBhY2tldCBvciBmb3IgbmV3IENQSCBydWxlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19kYl9nZXRfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqZmxvdywgQk9PTCBmb3JfcGFja2V0KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgIHJjICAgICAgICAgID0gRkFMU0U7CisgICAgdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhYmxlICovCisgICAgZm9yIChpZHggPSAwLCBydWxlX2lkeCA9IDA7IChpZHggPCBDUEhfRkxPV19FTlRSWV9OVU0pICYmIChydWxlX2lkeCA8IGdzX2Zsb3dfdGFibGUucnVsZV9udW0pOyBpZHgrKykKKyAgICB7CisgICAgICAgIHBfZmxvd19ydWxlID0gJmdzX2Zsb3dfdGFibGUuZmxvd19ydWxlW2lkeF07CisgICAgICAgIAorICAgICAgICAvKiBDb21wYXJlIHBhY2tldCBvciBuZXcgcnVsZSBydWxlIGRhdGEgYmFzZSBydWxlICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgaWYgKGZvcl9wYWNrZXQgPT0gVFJVRSkgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZShmbG93LCBwX2Zsb3dfcnVsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3J1bGVzKGZsb3csIHBfZmxvd19ydWxlKTsKKworICAgICAgICAgICAgaWYgKHJjID09IFRSVUUpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgZmxvdy0+b3BfdHlwZSA9IHBfZmxvd19ydWxlLT5vcF90eXBlOworICAgICAgICAgICAgICAgIG1lbWNweSgmZmxvdy0+bW9kX291dGVyX3RjaSwgJnBfZmxvd19ydWxlLT5tb2Rfb3V0ZXJfdGNpLCBzaXplb2YoQ1BIX0ZMT1dfVENJX1QpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmZsb3ctPm1vZF9pbm5lcl90Y2ksICZwX2Zsb3dfcnVsZS0+bW9kX2lubmVyX3RjaSwgc2l6ZW9mKENQSF9GTE9XX1RDSV9UKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZmbG93LT5wa3RfZnJ3ZCwgICAgICAmcF9mbG93X3J1bGUtPnBrdF9mcndkLCAgICAgIHNpemVvZihDUEhfRkxPV19GUldEX1QpKTsKKworICAgICAgICAgICAgICAgIC8qIEluY3JlYXNlIGNvdW50ICovCisgICAgICAgICAgICAgICAgaWYgKGZvcl9wYWNrZXQgPT0gVFJVRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+Y291bnQgPT0gMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1WX09LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gTVZfRkFJTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9hZGRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgZmxvdyBydWxlIHRvIGRhdGFiYXNlIAorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZGJfYWRkX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgVUlOVDMyICAgICAgICAgICAgaWR4ICAgICAgICAgPSAwOworICAgIENQSF9GTE9XX0VOVFJZX1QgKnBfZmxvd19ydWxlID0gTlVMTDsKKyAgICBCT09MICAgICAgICAgICAgICByYyAgICAgICAgICA9IE1WX09LOworICAgIHVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCisgICAgLyogSWYgdGhlIGZsb3cgdGFibGUgaXMgZnVsbCAqLworICAgIGlmIChnc19mbG93X3RhYmxlLnJ1bGVfbnVtID49IENQSF9GTE9XX0VOVFJZX05VTSkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmxvdyBydWxlIHRhYmxlIGlzIGZ1bGw8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZVTEw7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBjb25mbGljdGVkIHJ1bGVzICovCisgICAgaWYgKGNwaF9mbG93X2RiX2dldF9ydWxlKGNwaF9mbG93LCBGQUxTRSkgPT0gTVZfT0spCisgICAgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiJXMoKSwgYWxyZWFkeSBoYXMgY29uZmxpY3QgZmxvdyBydWxlIFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX09LOworICAgIH0KKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAKKyAgICAvKiBUcmF2ZXJzZSBDUEggZmxvdyBydWxlIHRhbGUgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IENQSF9GTE9XX0VOVFJZX05VTTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gRkFMU0UpCisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpZHggPT0gQ1BIX0ZMT1dfRU5UUllfTlVNKQorICAgIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpLCBmbG93IHJ1bGUgdGFibGUgaXMgZnVsbDwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIGdzX2Zsb3dfdGFibGUucnVsZV9udW0pOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAgICAgCisgICAgICAgIHJldHVybiBNVl9GVUxMOyAgICAKKyAgICB9CisKKyAgICAvKiBTYXZlIHRvIGRiICovCisgICAgbWVtY3B5KHBfZmxvd19ydWxlLCBjcGhfZmxvdywgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICBwX2Zsb3dfcnVsZS0+dmFsaWQgPSBUUlVFOworICAgIHBfZmxvd19ydWxlLT5jb3VudCA9IDA7CisgICAgZ3NfZmxvd190YWJsZS5ydWxlX251bSArKzsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOworCisgICAgcmV0dXJuIHJjOyAgIAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RiX2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZSBDUEggZmxvdyBtYXBwaW5nIHJ1bGUuCisqCisqIElOUFVUUzoKKyogICAgICAgZmxvdyAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2RlbF9ydWxlIChDUEhfRkxPV19FTlRSWV9UICpmbG93KQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgIHJjICAgICAgICAgID0gTVZfT0s7CisgICAgdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CisgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmdzX2Zsb3dfdGFibGUuZmxvd19sb2NrLCBmbGFncyk7ICAgIAorICAgIC8qIFRyYXZlcnNlIENQSCBmbG93IHJ1bGUgdGFsZSAqLworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNKSAmJiAocnVsZV9pZHggPCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcmMgPSBjcGhfZmxvd19jb21wYXJlX3J1bGVzKGZsb3csIHBfZmxvd19ydWxlKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBUUlVFKQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIG1lbXNldChwX2Zsb3dfcnVsZSwgMCwgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+dmFsaWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBnc19mbG93X3RhYmxlLnJ1bGVfbnVtLS07CisKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gTVZfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9jbGVhcl9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFyIENQSCBmbG93IG1hcHBpbmcgcnVsZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X2RiX2NsZWFyX3J1bGUgKFZPSUQpCit7CisgICAgVUlOVDMyIGlkeCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAKKyAgICAvKiBJbml0aWFsaXplcyBmbG93IHJ1bGUgKi8KKyAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2Zsb3dfdGFibGUsIDAsIHNpemVvZihDUEhfRkxPV19UQUJMRV9UKSk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgICAgICBnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdLnZhbGlkID0gRkFMU0U7CisgICAgCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9jbGVhcl9ydWxlX2J5X21oKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFyIENQSCBmbG93IG1hcHBpbmcgcnVsZXMgYnkgTUguCisqCisqIElOUFVUUzoKKyogICAgICAgbWggIC0gIE1hcnZlbGwgaGVhZGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZV9ieV9taCAoVUlOVDE2IG1oKQoreworICAgIENQSF9GTE9XX0VOVFJZX1QgICAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIFVJTlQzMiAgICAgICAgICAgICAgaWR4ID0gMDsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZnc19mbG93X3RhYmxlLmZsb3dfbG9jaywgZmxhZ3MpOyAgICAKKyAgICAvKiBJbml0aWFsaXplcyBmbG93IHJ1bGUgKi8KKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IENQSF9GTE9XX0VOVFJZX05VTTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworCisgICAgICAgIGlmICgocF9mbG93X3J1bGUtPnZhbGlkID09IFRSVUUpICYmCisgICAgICAgICAgICAocF9mbG93X3J1bGUtPm1oID09IG1oKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KHBfZmxvd19ydWxlLCAwLCBzaXplb2YoQ1BIX0ZMT1dfRU5UUllfVCkpOworICAgICAgICAgICAgcF9mbG93X3J1bGUtPnZhbGlkID0gRkFMU0U7CisgICAgICAgICAgICBnc19mbG93X3RhYmxlLnJ1bGVfbnVtLS07CisgICAgICAgIH0KKyAgICB9CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2ssIGZsYWdzKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kYl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIGZsb3cgbWFwcGluZyBkYXRhYmFzZS4KKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfZGJfaW5pdCAoVk9JRCkKK3sKKyAgICBVSU5UMzIgaWR4ID0gMDsKKyAgICAKKyAgICAvKiBJbml0aWFsaXplcyBmbG93IHJ1bGUgKi8KKyAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2Zsb3dfdGFibGUsIDAsIHNpemVvZihDUEhfRkxPV19UQUJMRV9UKSk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBDUEhfRkxPV19FTlRSWV9OVU07IGlkeCsrKQorICAgICAgICBnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdLnZhbGlkID0gRkFMU0U7CisKKyAgICBzcGluX2xvY2tfaW5pdCgmZ3NfZmxvd190YWJsZS5mbG93X2xvY2spOworCisgICAgLyogSW5pdGlhbGl6ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLworICAgIG1lbXNldCgoVUlOVDggKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihDUEhfRFNDUF9QQklUU19UKSk7CisgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd192ZXJpZnlfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBWZXJpZnkgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICB0Y2kgICAgICAgICAtIFRQSUQsIFZMQU4gSUQsIFAtYml0cyBpbmZvcm1hdGlvbi4KKyogICAgICAgcGFyc2VfZmllbGQgLSBXaGV0aGVyIHRoZSBUQ0kgaXMgZnJvbSBwYXJzaW5nIGZpZWxkLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBUUlVFLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MICBjcGhfZmxvd192ZXJpZnlfdGNpKENQSF9GTE9XX1RDSV9UICp0Y2ksIEJPT0wgcGFyc2VfZmllbGQpCit7CisgICAgVUlOVDE2IG1heF92aWQgICA9IDA7CisgICAgVUlOVDE2IG1heF9wYml0cyA9IDA7CisgICAgCisgICAgaWYgKHBhcnNlX2ZpZWxkID09IFRSVUUpCisgICAgeworICAgICAgICBtYXhfdmlkICAgPSBNVl9DUEhfVklEX05PVF9DQVJFX1ZBTFVFOworICAgICAgICBtYXhfcGJpdHMgPSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1heF92aWQgICA9IE1WX1ZMQU5fSURfTUFYOworICAgICAgICBtYXhfcGJpdHMgPSBNVl9QQklUU19NQVg7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgLyogQ2hlY2sgVFBJRCAqLworICAgIGlmICgodGNpLT50cGlkICE9IE1WX1RQSURfODEwMCkgJiYKKyAgICAgICAgKHRjaS0+dHBpZCAhPSBNVl9UUElEXzkxMDApICYmCisgICAgICAgICh0Y2ktPnRwaWQgIT0gTVZfVFBJRF84OEE4KSAmJgorICAgICAgICAoKHRjaS0+dHBpZCAhPSBNVl9DUEhfVFBJRF9OT1RfQ0FSRV9WQUxVRSkgJiYgKHBhcnNlX2ZpZWxkID09IFRSVUUpKSkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgInRwaWRbMHgleF0gaXMgaW52YWxpZCBcbiIsIHRjaS0+dHBpZCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBWSUQgKi8KKyAgICBpZiAodGNpLT52aWQgPiBtYXhfdmlkKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAidmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgdGNpLT52aWQsIG1heF92aWQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICAgIC8qIENoZWNrIFAtYml0cyAqLworICAgIGlmICh0Y2ktPnBiaXRzID4gbWF4X3BiaXRzKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAicGJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCB0Y2ktPnBiaXRzLCBtYXhfcGJpdHMpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3ZlcmlmeV9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFZlcmlmeSBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBUUlVFLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBGQUxTRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MICBjcGhfZmxvd192ZXJpZnlfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdywgQk9PTCBmdWxsKQoreworICAgIENQSF9ESVJfRSAgICAgICAgICBkaXIgICAgICAgICA9IENQSF9ESVJfVVM7CisgICAgQ1BIX0ZMT1dfUEFSU0VfRSAgIHBhcnNlX2JtICAgID0gMDsKKyAgICBDUEhfVkxBTl9PUF9UWVBFX0Ugb3BfdHlwZSAgICAgPSAwOyAgICAKKyAgICBDUEhfRkxPV19GUldEX1QgICAqcF9wa3RfZndkICAgPSBOVUxMOworICAgIEJPT0wgICAgICAgICAgICAgICByYyAgICAgICAgICA9IFRSVUU7CisKKyAgICAvKiBHZXQgaW5wdXQgaW5mb3JtYXRpb246IFZJRCwgUC1iaXRzLi4uICovCisgICAgaWYgKGNwaF9mbG93ID09IE5VTEwpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJjcGhfZmxvdyBpcyBOVUxMIFxuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9IAorCisgICAgZGlyICAgICAgID0gIGNwaF9mbG93LT5kaXI7ICAgIAorICAgIHBhcnNlX2JtICA9ICBjcGhfZmxvdy0+cGFyc2VfYm07CisgICAgb3BfdHlwZSAgID0gIGNwaF9mbG93LT5vcF90eXBlOyAgICAKKyAgICBwX3BrdF9md2QgPSAmY3BoX2Zsb3ctPnBrdF9mcndkOworCisgICAgLyogQ2hlY2sgZGlyICovCisgICAgaWYgKGRpciA+PSBDUEhfRElSX05PVF9DQVJFKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgZGlyLCBDUEhfRElSX05PVF9DQVJFKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIENoZWNrIHBhcnNlX2JtICovCisgICAgaWYgKChwYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOKSAmJiAKKyAgICAgICAgKHBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiQ2Fubid0IHNldCBwYXJzZV9ibSBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTiBhbmQgQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gYXQgdGhlIHNhbWUgdGltZSBcbiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgICAgIAorCisgICAgLyogQ2hlY2sgb3BfdHlwZSAqLworICAgIGlmIChvcF90eXBlID4gQ1BIX1ZMQU5fT1BfU1dBUCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIm9wX3R5cGVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCBvcF90eXBlLCBDUEhfVkxBTl9PUF9TV0FQKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayBUQ0kgKi8KKyAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV90Y2koJmNwaF9mbG93LT5wYXJzZV9vdXRlcl90Y2ksIFRSVUUpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgVFJVRSk7CisgICAgaWYgKHJjID09IEZBTFNFKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmMgPSBjcGhfZmxvd192ZXJpZnlfdGNpKCZjcGhfZmxvdy0+bW9kX291dGVyX3RjaSwgRkFMU0UpOworICAgIGlmIChyYyA9PSBGQUxTRSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJjID0gY3BoX2Zsb3dfdmVyaWZ5X3RjaSgmY3BoX2Zsb3ctPm1vZF9pbm5lcl90Y2ksIEZBTFNFKTsKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAKKyAgICAvKiBDaGVjayB0YXJnZXQgcG9ydC9xdWV1ZS9HRU0gcG9ydCAqLyAKKyAgICBpZiAocF9wa3RfZndkLT50cmdfcG9ydCA+IE1WX1RDT05UX0xMSURfTUFYKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAidHJnX3BvcnRbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG4iLCBwX3BrdF9md2QtPnRyZ19wb3J0LCBNVl9UQ09OVF9MTElEX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAocF9wa3RfZndkLT50cmdfcXVldWUgPiBNVl9RVUVVRV9NQVgpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICJTV0YgdHJnX3F1ZXVlWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgcF9wa3RfZndkLT50cmdfcXVldWUsIE1WX1FVRVVFX01BWCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9ICAgCisKKyAgICBpZiAocF9wa3RfZndkLT50cmdfaHdmX3F1ZXVlID4gTVZfUVVFVUVfTUFYKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiSFdGIHRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcbiIsIHBfcGt0X2Z3ZC0+dHJnX2h3Zl9xdWV1ZSwgTVZfUVVFVUVfTUFYKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0gICAgICAgCisKKyAgICBpZiAocF9wa3RfZndkLT5nZW1fcG9ydCA+IE1WX0dFTV9QT1JUX01BWCkgeworICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgImdlbV9wb3J0WyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuIiwgcF9wa3RfZndkLT5nZW1fcG9ydCwgTVZfR0VNX1BPUlRfTUFYKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2Rpc3BsYXlfdGNpKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERpc3BsYXkgVENJIHZhbHVlCisqCisqIElOUFVUUzoKKyogICAgICAgdGNpICAgICAgICAgLSBUQ0kgZmllbGQKKyogICAgICAgdHJhY2VfbGV2ZWwgLSBUcmFjZSBhbmQgZGVidWcgbGV2ZWwKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVk9JRCAgY3BoX2Zsb3dfZGlzcGxheV90Y2koQ1BIX0ZMT1dfVENJX1QgKnRjaSwgVUlOVDMyIHRyYWNlX2xldmVsKQoreworICAgIE1WX0NQSF9QUklOVCh0cmFjZV9sZXZlbCwgCisgICAgICAgICAgICAgICAgICJUUElEWzB4JXhdLCB2aWRbJWRdLCBwLWJpdHNbJWRdXG4iLAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT50cGlkOjApLAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT52aWQ6MCksIAorICAgICAgICAgICAgICAgICAoKHRjaSAhPSBOVUxMKT8gdGNpLT5wYml0czowKSk7CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2FkZF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIEJPT0wgcmMgPSBUUlVFOworCisgICAgLyogRGlzcGxheSBpbnB1dCBDUEggZmxvdyAqLworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT5cbiBkZWZhdWx0IHJ1bGVbJXNdLCBkaXJbJWRdLCBwYXJzZSBibVsleF0sIG1oWyVkXSwgZXRoIHR5cGVbMHgleF0sIG9wIHR5cGVbJWRdLCB0cmcgcG9ydFslZF0sIFNXRiBxdWV1ZVslZF0sIEhXRiBxdWV1ZVslZF0sIEdFTSBwb3J0WyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKGNwaF9mbG93LT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8iLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+ZGlyLCBjcGhfZmxvdy0+cGFyc2VfYm0sIGNwaF9mbG93LT5taCwgY3BoX2Zsb3ctPmV0aF90eXBlLCBjcGhfZmxvdy0+b3BfdHlwZSwKKyAgICAgICAgICAgICAgICAgY3BoX2Zsb3ctPnBrdF9mcndkLnRyZ19wb3J0LCBjcGhfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlLCBjcGhfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgY3BoX2Zsb3ctPnBrdF9mcndkLmdlbV9wb3J0KTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX291dGVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPm1vZF9vdXRlcl90Y2ksIENQSF9ERUJVR19MRVZFTCk7CisgICAgY3BoX2Zsb3dfZGlzcGxheV90Y2koJmNwaF9mbG93LT5tb2RfaW5uZXJfdGNpLCBDUEhfREVCVUdfTEVWRUwpOworICAgICAgICAgICAgCisgICAgLyogVmVyaWZ5IENQSCBmbG93IHJ1bGUgKi8KKyAgICByYyA9IGNwaF9mbG93X3ZlcmlmeV9ydWxlKGNwaF9mbG93LCBUUlVFKTsKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpLCB2ZXJpZnkgcnVsZSBmYWlsZWQgXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICAvKiBBZGQgZmxvdyBydWxlIHRvIGRhdGEgYmFzZSAqLworICAgIGlmIChjcGhfZmxvd19kYl9hZGRfcnVsZShjcGhfZmxvdykgIT0gTVZfT0spIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpLCBmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfYWRkX3J1bGVcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBmbG93IG1hcHBpbmcgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGNwaF9mbG93IC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfZGVsX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpCit7CisgICAgLyogRGlzcGxheSBpbnB1dCBDUEggZmxvdyAqLworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT5cbiBkZWZhdWx0IHJ1bGVbJXNdLCBkaXJbJWRdLCBwYXJzZSBibVsleF0sIG1oWyVkXSwgZXRoIHR5cGVbMHgleF0sIG9wIHR5cGVbJWRdXG4iLAorICAgICAgICAgICAgICAgICAoY3BoX2Zsb3ctPmlzX2RlZmF1bHQgPT0gVFJVRSk/ICJZZXMiOiJObyIsCisgICAgICAgICAgICAgICAgIGNwaF9mbG93LT5kaXIsIGNwaF9mbG93LT5wYXJzZV9ibSwgY3BoX2Zsb3ctPm1oLCBjcGhfZmxvdy0+ZXRoX3R5cGUsIGNwaF9mbG93LT5vcF90eXBlKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX291dGVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKworICAgIC8qIERlbGV0ZSBmbG93IHJ1bGUgZnJvbSBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfZGVsX3J1bGUoY3BoX2Zsb3cpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2RlbF9ydWxlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTVZfRkFJTDsKKyAgICB9CisKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiPC0tLS1cbiIpOworCisgICAgcmV0dXJuIE1WX09LOyAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19nZXRfdGFnX3J1bGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogR2V0cyBmbG93IG1hcHBpbmcgcnVsZSBmb3IgdGFnZ2VkIGZyYW1lcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIElucHV0IHZpZCwgcGJpdHMsIGRpcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIG91dHB1dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCAKKyogICAgICAgICAgICAgICAgICBULUNPTlQsIHF1ZXVlIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cy4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2dldF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KQoreworICAgIC8qIERpc3BsYXkgaW5wdXQgQ1BIIGZsb3cgKi8KKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLAorICAgICAgICAgICAgICAgICAiLS0tLT5cblBhY2tldCBmbG93IHJ1bGU6IGRlZmF1bHQgcnVsZVslc10sIGRpclslZF0sIHBhcnNlIGJtWyV4XSwgbWhbJWRdLCBldGggdHlwZVsweCV4XVxuIiwKKyAgICAgICAgICAgICAgICAgKGNwaF9mbG93LT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8iLAorICAgICAgICAgICAgICAgICBjcGhfZmxvdy0+ZGlyLCBjcGhfZmxvdy0+cGFyc2VfYm0sIGNwaF9mbG93LT5taCwgY3BoX2Zsb3ctPmV0aF90eXBlKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX291dGVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKyAgICBjcGhfZmxvd19kaXNwbGF5X3RjaSgmY3BoX2Zsb3ctPnBhcnNlX2lubmVyX3RjaSwgQ1BIX0RFQlVHX0xFVkVMKTsKKworICAgIC8qIEdldCBmbG93IHJ1bGUgZnJvbSBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfZ2V0X3J1bGUoY3BoX2Zsb3csIFRSVUUpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICIlcygpLCBmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfZ2V0X3J1bGVcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7CisKKyAgICByZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfY2xlYXJfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZsb3cgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2NsZWFyX3J1bGUoVk9JRCkKK3sKKyAgICAvKiBEaXNwbGF5IGlucHV0IENQSCBmbG93ICovCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgCisgICAgICAgICAgICAgICAgICItLS0tPlxuIik7CisKKyAgICAvKiBDbGVhciBmbG93IHJ1bGUgZnJvbSBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZSgpICE9IE1WX09LKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKSwgZmFpbCB0byBjYWxsIGNwaF9mbG93X2RiX2NsZWFyX3J1bGVcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICI8LS0tLVxuIik7IAorICAgIHJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBmbG93IG1hcHBpbmcgcnVsZXMgYnkgTUgKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgIC0gIE1hcnZlbGwgaGVhZGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKFVJTlQxNiBtaCkKK3sKKyAgICAvKiBEaXNwbGF5IGlucHV0IENQSCBmbG93ICovCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgCisgICAgICAgICAgICAgICAgICItLS0tPiAgbWgoJWQpXG4iLCBtaCk7CisKKyAgICAvKiBDbGVhciBmbG93IHJ1bGUgZnJvbSBkYXRhIGJhc2UgKi8KKyAgICBpZiAoY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZV9ieV9taChtaCkgIT0gTVZfT0spIHsKKyAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpLCBmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfY2xlYXJfcnVsZV9ieV9taFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE1WX0ZBSUw7CisgICAgfQorCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsgCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3NldF9kc2NwX21hcCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZXRzIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKKyoKKyogSU5QVVRTOgorKiAgICAgICBkc2NwX21hcCAgLSBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiAgY3BoX2Zsb3dfc2V0X2RzY3BfbWFwKENQSF9EU0NQX1BCSVRTX1QgKmRzY3BfbWFwKQoreworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsIAorICAgICAgICAgICAgICAgICAiLS0tLT4gaW5fdXNlWyVkXVxuIiwKKyAgICAgICAgICAgICAgICAgKChkc2NwX21hcCE9IE5VTEwpPyBkc2NwX21hcC0+aW5fdXNlOjApKTsKKworICAgIGlmIChkc2NwX21hcCA9PSBOVUxMKSB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiSW5wdXQgZHNjcF9tYXAgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNVl9GQUlMOworICAgIH0KKworICAgIC8qIENhc2UgMTogdG8gZW5hYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KKyAgICBpZiAoZHNjcF9tYXAtPmluX3VzZSAhPSAwKSB7CisgICAgICAgIG1lbWNweSgmZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbMF0sICZkc2NwX21hcC0+cGJpdHNbMF0sIHNpemVvZihnc19kc2NwX21hcF90YWJsZS5wYml0cykpOworICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAxOworICAgIAorICAgIH0KKyAgICAvKiBDYXNlIDI6IHRvIGRpc2FibGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLworICAgIGVsc2UgeworICAgICAgICBtZW1zZXQoKFVJTlQ4ICopJmdzX2RzY3BfbWFwX3RhYmxlLCAwLCBzaXplb2YoZ3NfZHNjcF9tYXBfdGFibGUpKTsKKyAgICAgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKKyAgICB9CisgICAgCisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIjwtLS0tXG4iKTsKKworICAgIHJldHVybiBNVl9PSzsgICAKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kZWxfZHNjcF9tYXAoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RlbF9kc2NwX21hcChWT0lEKQoreworICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICItLS0tPlxuIik7CisKKyAgICAvKiBDbGVhciBEU0NQIHRvIFAtYml0cyBtYXBwaW5nICovCisgICAgbWVtc2V0KChVSU5UOCAqKSZnc19kc2NwX21hcF90YWJsZSwgMCwgc2l6ZW9mKGdzX2RzY3BfbWFwX3RhYmxlKSk7CisgICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKKyAgICAKKyAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiPC0tLS1cbiIpOworCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2FkZF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEFkZCBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgdHBpZCAgIC0gVHlwZSBvZiBWTEFOIElECisqICAgICAgIHZpZCAgICAtIFZMQU4gdG8gYmUgYWRkZWQKKyogICAgICAgcGJpdHMgIC0gUC1iaXRzIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfYWRkX3ZsYW4oQk9PTCBtaCwgVUlOVDggKnBfZGF0YSwgVUlOVDE2IHRwaWQsIFVJTlQxNiB2aWQsIFVJTlQ4IHBiaXRzKQoreworICAgIFVJTlQ4ICAqcF9uZXcgID0gTlVMTDsKKyAgICBVSU5UMTYgKnBfdmxhbiA9IE5VTEw7CisgICAgVUlOVDMyICBsZW4gICAgPSAwOworCisgICAgcF9uZXcgPSBwX2RhdGEgLSBNVl9WTEFOX0hMRU47CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICAgICAgbGVuID0gTVZfRVRIX01IX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKyAgICBlbHNlCisgICAgICAgIGxlbiA9IE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworCisgICAgbWVtbW92ZShwX25ldywgcF9kYXRhLCBsZW4pOworCisgICAgcF92bGFuID0gKFVJTlQxNiAqKShwX25ldyAgKyBsZW4pOworICAgIAorICAgIC8qIFNldCBWTEFOIFR5cGUgKi8KKyAgICAqcF92bGFuID0gaHRvbnModHBpZCk7CisgICAgcF92bGFuKys7CisKKyAgICAvKiBTZXQgVklEICsgcHJpb3JpdHkgKi8gICAgCisgICAgKnBfdmxhbiA9IGh0b25zKCh2aWQgJiBNVl9WTEFOX0lEX01BU0spIHwgKChwYml0cyAmIE1WX1BCSVRTX01BU0spIDw8IE1WX1BCSVRTX1NISUZUKSk7CisKKyAgICByZXR1cm4gLU1WX1ZMQU5fSExFTjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kZWxfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0LgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X2RlbF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEpCit7CisgICAgVUlOVDggICpwX25ldyAgPSBOVUxMOworICAgIFVJTlQzMiAgbGVuICAgID0gMDsKKworICAgIHBfbmV3ID0gcF9kYXRhICsgTVZfVkxBTl9ITEVOOworCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgICAgIGxlbiA9IE1WX0VUSF9NSF9TSVpFICsgTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKworICAgIG1lbW1vdmUocF9uZXcsIHBfZGF0YSwgbGVuKTsKKworICAgIHJldHVybiBNVl9WTEFOX0hMRU47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfc3RyaXBfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBEZWxldGUgYWxsIFZMQU4gdGFncyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldC4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19zdHJpcF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEpCit7CisgICAgSU5UMzIgIG9mZnNldCAgICAgICA9IDA7CisgICAgSU5UMzIgIHRvdGFsX29mZnNldCA9IDA7ICAgIAorICAgIFVJTlQxNiBldGhfdHlwZSAgICAgPSAwOworICAgIFVJTlQ4ICpwX2ZpZWxkICAgICAgPSBOVUxMOworICAgIFVJTlQzMiBsZW4gICAgICAgICAgPSAwOworCisgICAgaWYgKFRSVUUgPT0gbWgpCisgICAgICAgIGxlbiA9IE1WX0VUSF9NSF9TSVpFICsgTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBsZW4gPSBNVl9NQUNfQUREUl9TSVpFICsgTVZfTUFDX0FERFJfU0laRTsKKworICAgIHBfZmllbGQgID0gcF9kYXRhICsgbGVuOworICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKworICAgIHdoaWxlIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgCisgICAgeworICAgICAgICBvZmZzZXQgICA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBwX2RhdGErb2Zmc2V0KTsKKyAgICAgICAgCisgICAgICAgIHBfZmllbGQgKz0gb2Zmc2V0OworICAgICAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgIHRvdGFsX29mZnNldCArPSBvZmZzZXQ7CisgICAgfSAgICAKKworICAgIHJldHVybiB0b3RhbF9vZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfcmVwbGFjZV92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFJlcGxhY2Ugb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHRwaWQgICAtIFR5cGUgb2YgVkxBTiBJRAorKiAgICAgICB2aWQgICAgLSBWTEFOIHRvIGJlIGFkZGVkCisqICAgICAgIHBiaXRzICAtIFAtYml0cyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3JlcGxhY2VfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhLCBVSU5UMTYgdHBpZCwgVUlOVDE2IHZpZCwgVUlOVDggcGJpdHMpCit7CisgICAgVUlOVDE2ICpwX3ZsYW4gPSBOVUxMOworICAgIFVJTlQzMiAgbGVuICAgID0gMDsKKworICAgIGlmIChUUlVFID09IG1oKQorICAgICAgICBsZW4gPSBNVl9FVEhfTUhfU0laRSArIE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisKKyAgICBwX3ZsYW4gPSAoVUlOVDE2ICopKHBfZGF0YSArIGxlbik7CisgICAgCisgICAgLyogU2V0IFZMQU4gVHlwZSAqLworICAgICpwX3ZsYW4gPSBodG9ucyh0cGlkKTsKKyAgICBwX3ZsYW4rKzsKKyAgICAKKyAgICAvKiBTZXQgVklEICsgcHJpb3JpdHkgKi8KKyAgICAqcF92bGFuID0gaHRvbnMoKHZpZCAmIE1WX1ZMQU5fSURfTUFTSykgfCAoKHBiaXRzICYgTVZfUEJJVFNfTUFTSykgPDwgTVZfUEJJVFNfU0hJRlQpKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3N3YXBfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTd2FwIGJldHdlZW4gdHdvIFZMQU4gdGFnLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X3N3YXBfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKQoreworICAgIFVJTlQzMiAqcF90Y2kgPSBOVUxMOworICAgIFVJTlQzMiAgdGNpMSAgPSAwOworICAgIFVJTlQzMiAgdGNpMiAgPSAwOworICAgIFVJTlQzMiAgbGVuICAgID0gMDsKKworICAgIGlmIChUUlVFID09IG1oKQorICAgICAgICBsZW4gPSBNVl9FVEhfTUhfU0laRSArIE1WX01BQ19BRERSX1NJWkUgKyBNVl9NQUNfQUREUl9TSVpFOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gTVZfTUFDX0FERFJfU0laRSArIE1WX01BQ19BRERSX1NJWkU7CisKKyAgICBwX3RjaSA9IChVSU5UMzIgKikocF9kYXRhICsgbGVuKTsKKyAgICAKKyAgICAvKiBTYXZlIGZpcnN0IFRDSSAqLworICAgIHRjaTEgPSBudG9obCgqcF90Y2kpOworICAgIHBfdGNpKys7CisKKyAgICAvKiBTYXZlIHNlY29uZCBUQ0kgYW5kIHJlcGxhY2UgaXQgdy8gZmlyc3QgVENJICovCisgICAgdGNpMiAgID0gbnRvaGwoKnBfdGNpKTsKKyAgICAqcF90Y2kgPSBodG9ubCh0Y2kxKTsKKworICAgIC8qIEdvIGJhY2sgdG8gcmVwbGNlIGZpcnN0IFRDSSAqLworICAgIHBfdGNpLS07ICAgIAorICAgICpwX3RjaSA9IGh0b25sKHRjaTIpOworICAgIAorICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3BhcnNlX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBwYWNrZXQgYW5kIG91dHB1dCBmbG93IGluZm9ybWF0aW9uLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgLSBTb3VyY2UgR01BQyBwb3J0CisqICAgICAgIGRhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICByeCAgIC0gV2hldGhlciBpbiBSWCBkaXIKKyogICAgICAgbWggICAtIFdoZXRoZXIgaGFzIE1hcnZlbGwgaGVhZGVyCisqCisqIE9VVFBVVFM6CisqICAgICAgIGZsb3cgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBjcGhfZmxvd19wYXJzZV9wYWNrZXQgKElOVDMyIHBvcnQsIFVJTlQ4ICpkYXRhLCBCT09MIHJ4LCBCT09MIG1oLCBDUEhfRkxPV19FTlRSWV9UICpmbG93KQoreworICAgIFVJTlQxNiAgICAgIGV0aF90eXBlID0gMDsgCisgICAgVUlOVDggICAgICAqcF9maWVsZCAgPSBOVUxMOworICAgIFVJTlQ4ICAgICAgIHByb3RvICAgID0gMDsKKyAgICBNVl9TVEFUVVMgICByYyAgICAgICA9IE1WX09LOworICAgIHN0cnVjdCBpcHY2aGRyICAgICAgICAgKnBfaXB2Nl9oZHIgICA9IE5VTEw7CisgICAgc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqcF9ob3BvcHRfaGRyID0gTlVMTDsKKyAgICBzdHJ1Y3QgaWNtcDZoZHIgICAgICAgICpwX2ljbXBfaGRyICAgPSBOVUxMOyAgICAgCisKKyAgICBtZW1zZXQoZmxvdywgMCwgc2l6ZW9mKENQSF9GTE9XX0VOVFJZX1QpKTsKKyAgICAKKyAgICAvKiBQYXJzZSBEaXJlY3Rpb24gKi8KKyAgICBmbG93LT5kaXIgPSBjcGhfYXBwX3BhcnNlX2Rpcihwb3J0LCByeCk7CisgICAgaWYoZmxvdy0+ZGlyID09IENQSF9ESVJfSU5WQUxJRCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBpbnZhbGlkIFxuIiwgZmxvdy0+ZGlyKTsKKyAgICAgICAgcmV0dXJuIE1WX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoVFJVRSA9PSBtaCkKKyAgICB7CisgICAgICAgIC8qIFBhcnNlIE1hcnZlbGwgaGVhZGVyICovCisgICAgICAgIGlmIChmbG93LT5kaXIgPT0gQ1BIX0RJUl9VUykKKyAgICAgICAgICAgIGZsb3ctPm1oID0gKG50b2hzKCooVUlOVDE2ICopZGF0YSkgJiBNVl9WQUxJRF9NSF9NQVNLKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxvdy0+bWggPSAobnRvaHMoKihVSU5UMTYgKilkYXRhKSAmIE1WX1ZBTElEX0dIX01BU0spOworICAgICAgICAKKyAgICAgICAgZmxvdy0+cGFyc2VfYm0gfD0gQ1BIX0ZMT1dfUEFSU0VfTUg7CisgICAgICAgIHBfZmllbGQgID0gZGF0YSArIE1WX0VUSF9NSF9TSVpFICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsgICAgICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9maWVsZCAgPSBkYXRhICsgRVRIX0FMRU4gKyBFVEhfQUxFTjsgCisgICAgfQorCisgICAgLyogUGFyc2UgVkxBTiB0YWcgKi8KKyAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgaWYgKGV0aF90eXBlID09IE1WX1RQSURfODEwMCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzg4QTggfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF85MTAwKSAKKyAgICB7CisgICAgICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOOworICAgICAgICAKKyAgICAgICAgZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnRwaWQgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgICAgICBwX2ZpZWxkICs9IE1WX0NQSF9UUElEX0xFTjsKKworICAgICAgICBmbG93LT5wYXJzZV9vdXRlcl90Y2kudmlkICAgPSAobnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKSAmIE1WX1ZMQU5fSURfTUFTSyk7CisgICAgICAgIGZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0cyA9ICgobnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKSA+PiBNVl9QQklUU19TSElGVCkmIE1WX1BCSVRTX01BU0spOworICAgICAgICAKKyAgICAgICAgcF9maWVsZCArPSBNVl9DUEhfVkxBTl9UQUdfTEVOOworCisgICAgICAgIGV0aF90eXBlID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICAgICAgaWYgKGV0aF90eXBlID09IE1WX1RQSURfODEwMCB8fCBldGhfdHlwZSA9PSBNVl9UUElEXzg4QTggfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF85MTAwKSAKKyAgICAgICAgeworICAgICAgICAgICAgZmxvdy0+cGFyc2VfYm0gJj0gfkNQSF9GTE9XX1BBUlNFX0VYVF9WTEFOOworICAgICAgICAgICAgZmxvdy0+cGFyc2VfYm0gfD0gQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU47CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZsb3ctPnBhcnNlX2lubmVyX3RjaS50cGlkID0gbnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKTsKKyAgICAgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX1RQSURfTEVOOworCisgICAgICAgICAgICBmbG93LT5wYXJzZV9pbm5lcl90Y2kudmlkICAgPSAobnRvaHMoKihVSU5UMTYgKilwX2ZpZWxkKSAmIE1WX1ZMQU5fSURfTUFTSyk7CisgICAgICAgICAgICBmbG93LT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgPSAoKG50b2hzKCooVUlOVDE2ICopcF9maWVsZCkgPj4gTVZfUEJJVFNfU0hJRlQpJiBNVl9QQklUU19NQVNLKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcF9maWVsZCArPSBNVl9DUEhfVkxBTl9UQUdfTEVOOworCisgICAgICAgICAgICBldGhfdHlwZSA9IG50b2hzKCooVUlOVDE2ICopcF9maWVsZCk7CisgICAgICAgIH0gICAgICAKKyAgICB9ICAgIAorICAgIHdoaWxlIChldGhfdHlwZSA9PSBNVl9UUElEXzgxMDAgfHwgZXRoX3R5cGUgPT0gTVZfVFBJRF84OEE4IHx8IGV0aF90eXBlID09IE1WX1RQSURfOTEwMCkgeworICAgICAgICBwX2ZpZWxkICs9IFZMQU5fSExFTjsKKyAgICAgICAgZXRoX3R5cGUgPSBudG9ocygqKFVJTlQxNiAqKXBfZmllbGQpOworICAgIH0KKyAgICAvKiBQYXJzZSBFdGggdHlwZSAqLyAgICAKKyAgICBmbG93LT5ldGhfdHlwZSA9IGV0aF90eXBlOworICAgIGZsb3ctPnBhcnNlX2JtIHw9IENQSF9GTE9XX1BBUlNFX0VUSF9UWVBFOworCisgICAgLyogUGFyc2UgTXVsdGljYXN0IHByb3RvY29sICovCisgICAgaWYgKE1WX0NQSF9FVEhfVFlQRV9JUFY0ID09IGZsb3ctPmV0aF90eXBlKSB7CisgICAgICAgIHBfZmllbGQgKz0gTVZfQ1BIX0VUSF9UWVBFX0xFTjsKKyAgICAgICAgcF9maWVsZCArPSBNVl9JUFY0X1BST1RPX09GRlNFVDsKKyAgICAgICAgcHJvdG8gPSAqKFVJTlQ4ICopcF9maWVsZDsKKworICAgICAgICBpZiAoSVBQUk9UT19JR01QID09IHByb3RvKQorICAgICAgICAgICAgZmxvdy0+cGFyc2VfYm0gfD0gQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE87CisgICAgfQorICAgIGVsc2UgaWYgKE1WX0NQSF9FVEhfVFlQRV9JUFY2ID09IGZsb3ctPmV0aF90eXBlKSB7CisgICAgICAgIHBfaXB2Nl9oZHIgPSAoc3RydWN0IGlwdjZoZHIgKikocF9maWVsZCArIE1WX0NQSF9FVEhfVFlQRV9MRU4pOworCisgICAgICAgIGlmIChORVhUSERSX0hPUCA9PSBwX2lwdjZfaGRyLT5uZXh0aGRyKSB7CisgICAgICAgICAgICBwX2hvcG9wdF9oZHIgPSAoc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqKSgoVUlOVDggKilwX2lwdjZfaGRyICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CisKKyAgICAgICAgICAgIGlmIChJUFBST1RPX0lDTVBWNiA9PSBwX2hvcG9wdF9oZHItPm5leHRoZHIpIHsKKyAgICAgICAgICAgICAgICBwX2ljbXBfaGRyID0gIChzdHJ1Y3QgaWNtcDZoZHIgKikoKFVJTlQ4ICopcF9ob3BvcHRfaGRyICsgaXB2Nl9vcHRsZW4ocF9ob3BvcHRfaGRyKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3dpdGNoIChwX2ljbXBfaGRyLT5pY21wNl90eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUFY2X01HTV9RVUVSWToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFUE9SVDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1JFRFVDVElPTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QVjZfTUxEMl9SRVBPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5wYXJzZV9ibSB8PSBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2NvbXBhcmVfcnVsZXMoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ29tcGFyZSB0d28gZmxvdyBydWxlcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBwYXJzZV9ydWxlICAtIFRoZSBwYXJzaW5nIGZpZWxkIHZhbHVlcyBjb21lIGZyb20gdGhlIHBhY2tldHMKKyogICAgICAgZGJfcnVsZSAgICAgLSBUaGUgZmxvdyBydWxlIHN0b3JlZCBpbiBmbG93IGRhdGFiYXNlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIEluIGNhc2Ugc2FtZSwgcmV0dXJuIFRSVUUsIAorKiAgICAgICBJbiBjYXNlIGRpZmZlcmVudCwgcmV0dXJuIEZBTFNFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0JPT0wgY3BoX2Zsb3dfY29tcGFyZV9ydWxlcyAoQ1BIX0ZMT1dfRU5UUllfVCAqcGFyc2VfcnVsZSwgQ1BIX0ZMT1dfRU5UUllfVCAqZGJfcnVsZSkKK3sKKyAgICAvKiBDaGVjayBkaXJlY3Rpb24gKi8KKyAgICBpZiAocGFyc2VfcnVsZS0+ZGlyICE9IGRiX3J1bGUtPmRpcikKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLyogQ2hlY2sgcGFyc2VfYm0gKi8KKyAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfYm0gIT0gZGJfcnVsZS0+cGFyc2VfYm0pCisgICAgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSAgCisKKyAgICAvKiBDaGVjayBNSCBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NSCkKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9ydWxlLT5taCAhPSBkYl9ydWxlLT5taCkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiBpdCBpcyBkZWZhdWx0IHJ1bGUgKi8KKyAgICBpZiAocGFyc2VfcnVsZS0+aXNfZGVmYXVsdCAhPSBkYl9ydWxlLT5pc19kZWZhdWx0KQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgCisgICAgLyogQ2hlY2sgVkxBTiBJRCAqLworICAgIGlmIChwYXJzZV9ydWxlLT5pc19kZWZhdWx0ID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOKSB8fCAgCisgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgIGlmIChwYXJzZV9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS52aWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS5wYml0cykKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCAhPSBkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgIGlmIChwYXJzZV9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS52aWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAocGFyc2VfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS5wYml0cykKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ2hlY2sgRXRoZXJuZXQgdHlwZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FVEhfVFlQRSkKKyAgICB7CisgICAgICAgIGlmIChwYXJzZV9ydWxlLT5ldGhfdHlwZSAhPSBkYl9ydWxlLT5ldGhfdHlwZSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIGZsb3cgcGFja2V0IGFuZCBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhY2tldF9ydWxlIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqcGFja2V0X3J1bGUsIENQSF9GTE9XX0VOVFJZX1QgKmRiX3J1bGUpCit7CisgICAgLyogQ2hlY2sgZGlyZWN0aW9uICovCisgICAgaWYgKChwYWNrZXRfcnVsZS0+ZGlyICE9IGRiX3J1bGUtPmRpcikgJiYKKyAgICAgICAgKGRiX3J1bGUtPmRpciAhPSBDUEhfRElSX05PVF9DQVJFKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLyogQ2hlY2sgTXVsdGljYXN0IHByb3RvY29sICovCisgICAgIGlmICgoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTykgIT0gKHBhY2tldF9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01DX1BST1RPKSkKKyAgICB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgTUggaWYgbmVlZGVkICovCisgICAgaWYgKChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX01IKSAmJgorICAgICAgICAocGFja2V0X3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUgpICkKKyAgICB7CisgICAgICAgIGlmIChwYWNrZXRfcnVsZS0+bWggIT0gZGJfcnVsZS0+bWgpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgaXQgaXMgZGVmYXVsdCBydWxlICovCisgICAgaWYgKHBhY2tldF9ydWxlLT5pc19kZWZhdWx0ICE9IGRiX3J1bGUtPmlzX2RlZmF1bHQpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAKKyAgICAvKiBDaGVjayBWTEFOIElEICovCisgICAgaWYgKChwYWNrZXRfcnVsZS0+cGFyc2VfYm0gJiAoQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gfCBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpCisgICAgICAgICAhPSAoZGJfcnVsZS0+cGFyc2VfYm0gJiAoQ1BIX0ZMT1dfUEFSU0VfRVhUX1ZMQU4gfCBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKHBhY2tldF9ydWxlLT5pc19kZWZhdWx0ID09IEZBTFNFKQorICAgIHsKKyAgICAgICAgaWYgKChkYl9ydWxlLT5wYXJzZV9ibSAmIENQSF9GTE9XX1BBUlNFX0VYVF9WTEFOKSB8fCAgCisgICAgICAgICAgICAoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9UV09fVkxBTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocGFja2V0X3J1bGUtPnBhcnNlX291dGVyX3RjaS50cGlkICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS50cGlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCAhPSBNVl9DUEhfVFBJRF9OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9vdXRlcl90Y2kudmlkICE9IGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS52aWQpICYmCisgICAgICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX291dGVyX3RjaS52aWQgIT0gTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgIT0gZGJfcnVsZS0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgIT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRiX3J1bGUtPnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfVFdPX1ZMQU4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgocGFja2V0X3J1bGUtPnBhcnNlX2lubmVyX3RjaS50cGlkICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS50cGlkKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCAhPSBNVl9DUEhfVFBJRF9OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9pbm5lcl90Y2kudmlkICE9IGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS52aWQpICYmCisgICAgICAgICAgICAgICAgKGRiX3J1bGUtPnBhcnNlX2lubmVyX3RjaS52aWQgIT0gTVZfQ1BIX1ZJRF9OT1RfQ0FSRV9WQUxVRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoKHBhY2tldF9ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgIT0gZGJfcnVsZS0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzKSAmJgorICAgICAgICAgICAgICAgIChkYl9ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgIT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ2hlY2sgRXRoZXJuZXQgdHlwZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZGJfcnVsZS0+cGFyc2VfYm0gJiBDUEhfRkxPV19QQVJTRV9FVEhfVFlQRSkKKyAgICB7CisgICAgICAgIGlmIChwYWNrZXRfcnVsZS0+ZXRoX3R5cGUgIT0gZGJfcnVsZS0+ZXRoX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfbW9kX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBNb2RpZnkgcGFja2V0IGFjY29yZGluZyB0byBmbG93IHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBza2IgICAgICAgIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgbWggICAgICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBmbG93ICAgICAgIC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKiAgICAgICBvdXRfb2Zmc2V0IC0gT2Zmc2V0IG9mIHBhY2tldAorKiAgICAgICByeCAgICAgICAgIC0gV2hldGhlciBSWCBvciBUWAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfbW9kX3BhY2tldCAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgIEJPT0wgbWgsIENQSF9GTE9XX0VOVFJZX1QgKmZsb3csIElOVDMyICpvdXRfb2Zmc2V0KQoreworICAgIElOVDMyICBvZmZzZXQgPSAwOworICAgIFVJTlQxNiB0cGlkICAgPSAwOyAgICAKKyAgICBVSU5UMTYgdmlkICAgID0gMDsKKyAgICBVSU5UOCAgcGJpdHMgID0gMDsKKyAgICBCT09MICAgcmMgICAgID0gTVZfT0s7CisKKyAgICBzd2l0Y2ggKGZsb3ctPm9wX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FTSVM6CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9ESVNDQVJEOgorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREOgorICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfQ09QWV9EU0NQOgorICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfT1VURVJfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF9DT1BZX0lOTkVSX1BCSVQ6CisgICAgICAgICAgICB0cGlkICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9BRERfMl9UQUdTOgorICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsgICAKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIGZsb3ctPm1vZF9pbm5lcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX0RTQ1A6CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsgICAKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBmbG93LT5tb2RfaW5uZXJfdGNpLnBiaXRzKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX0FERF8yX1RBR1NfQ09QWV9QQklUOgorICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgcGJpdHMgID0gKGZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0czsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgdHBpZCAgID0gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkID8gZmxvdy0+bW9kX2lubmVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOyAKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9pbm5lcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfYWRkX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgcGJpdHMpOyAgICAgICAgICAgIAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVNOgorICAgICAgICAgICAgb2Zmc2V0ID0gY3BoX2Zsb3dfZGVsX3ZsYW4obWgsIHNrYi0+ZGF0YSk7ICAgICAgICAgICAgCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRU1fMl9UQUdTOgorICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X2RlbF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRToKKyAgICAgICAgICAgIHRwaWQgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgZmxvdy0+bW9kX291dGVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBDUEhfVkxBTl9PUF9SRVBMQUNFX1ZJRDoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9vdXRlcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfUEJJVDoKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisKKyAgICAgICAgICAgIHZpZCAgICA9IChmbG93LT5wYXJzZV9vdXRlcl90Y2kudmlkID09IE1WX0NQSF9WSURfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX291dGVyX3RjaS52aWQ7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfQUREX09VVEVSOgorICAgICAgICAgICAgdHBpZCA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIG9mZnNldCA9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2RfaW5uZXJfdGNpLnZpZCwgZmxvdy0+bW9kX2lubmVyX3RjaS5wYml0cyk7CisgICAgICAgICAgICB0cGlkID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X2FkZF92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9BRERfT1VURVJfQ09QWV9QQklUOgorICAgICAgICAgICAgdHBpZCA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICA9IChmbG93LT5wYXJzZV9pbm5lcl90Y2kucGJpdHMgPT0gTVZfQ1BIX1BCSVRTX05PVF9DQVJFX1ZBTFVFKT8gMDpmbG93LT5wYXJzZV9pbm5lcl90Y2kucGJpdHM7CisgICAgICAgICAgICBvZmZzZXQgPSBjcGhfZmxvd19yZXBsYWNlX3ZsYW4obWgsIHNrYi0+ZGF0YSwgdHBpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIHBiaXRzKTsKKyAgICAgICAgICAgIHRwaWQgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBwYml0cyAgID0gKGZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0cyA9PSBNVl9DUEhfUEJJVFNfTk9UX0NBUkVfVkFMVUUpPyAwOmZsb3ctPnBhcnNlX291dGVyX3RjaS5wYml0czsgICAgICAgICAgICAKKyAgICAgICAgICAgIG9mZnNldCArPSBjcGhfZmxvd19hZGRfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9SRU1fT1VURVI6CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfZGVsX3ZsYW4obWgsIHNrYi0+ZGF0YSk7CisgICAgICAgICAgICB0cGlkICAgID0gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkID8gZmxvdy0+bW9kX291dGVyX3RjaS50cGlkIDogTVZfVFBJRF84MTAwOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX291dGVyX3RjaS52aWQsIGZsb3ctPm1vZF9vdXRlcl90Y2kucGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfUkVQTEFDRV8yVEFHUzoKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgPyBmbG93LT5tb2RfaW5uZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgID0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvdy0+bW9kX2lubmVyX3RjaS52aWQsIGZsb3ctPm1vZF9pbm5lcl90Y2kucGJpdHMpOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3N3YXBfdmxhbihtaCwgc2tiLT5kYXRhKTsKKyAgICAgICAgICAgIHRwaWQgICAgPSBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgPyBmbG93LT5tb2Rfb3V0ZXJfdGNpLnRwaWQgOiBNVl9UUElEXzgxMDA7CisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfcmVwbGFjZV92bGFuKG1oLCBza2ItPmRhdGEsIHRwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9vdXRlcl90Y2kudmlkLCBmbG93LT5tb2Rfb3V0ZXJfdGNpLnBiaXRzKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgIAorICAgICAgICBjYXNlIENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1NfVklEOgorICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9pbm5lcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICAgPSAoZmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2VfaW5uZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ICA9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb3ctPm1vZF9pbm5lcl90Y2kudmlkLCBwYml0cyk7CisgICAgICAgICAgICBvZmZzZXQgKz0gY3BoX2Zsb3dfc3dhcF92bGFuKG1oLCBza2ItPmRhdGEpOworICAgICAgICAgICAgdHBpZCAgICA9IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA/IGZsb3ctPm1vZF9vdXRlcl90Y2kudHBpZCA6IE1WX1RQSURfODEwMDsKKyAgICAgICAgICAgIHBiaXRzICAgPSAoZmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzID09IE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSk/IDA6Zmxvdy0+cGFyc2Vfb3V0ZXJfdGNpLnBiaXRzOworICAgICAgICAgICAgb2Zmc2V0ICs9IGNwaF9mbG93X3JlcGxhY2VfdmxhbihtaCwgc2tiLT5kYXRhLCB0cGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG93LT5tb2Rfb3V0ZXJfdGNpLnZpZCwgcGJpdHMpOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgQ1BIX1ZMQU5fT1BfU1dBUDoKKyAgICAgICAgICAgIG9mZnNldCAgPSBjcGhfZmxvd19zd2FwX3ZsYW4obWgsIHNrYi0+ZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFNhdmUgU0tCIGRhdGEgb2Zmc2V0ICovCisgICAgc2tiLT5kYXRhICArPSBvZmZzZXQ7CisgICAgc2tiLT5sZW4gICAtPSBvZmZzZXQ7CisgICAgKm91dF9vZmZzZXQgPSBvZmZzZXQ7CisgICAgCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X21vZF9mcndkKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IE1vZGlmeSBmb3J3YXJkaW5nIHBhcmFtZXRlciBvZiB0cmFuc21pdGluZyBwYWNrZXQgYWNjb3JkaW5nIHRvIGZsb3cgcnVsZQorKgorKiBJTlBVVFM6CisqICAgICAgIGZsb3cgICAgICAgIC0gRmxvdyBwYXJzaW5nIGZpZWxkIHZhbHVlcworKiAgICAgICB0eF9zcGVjX291dCAtIFRYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9mcndkIChDUEhfRkxPV19FTlRSWV9UICpmbG93LCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIE1WX1NUQVRVUyByYyA9IE1WX09LOworICAgIAorICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQ7CisgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBmbG93LT5wa3RfZnJ3ZC50cmdfcXVldWU7CisgICAgaWYgKChGQUxTRSA9PSBjcGhfZGJfZ2V0X3Rjb250X3N0YXRlKHR4X3NwZWNfb3V0LT50eHApKSB8fAorICAgICAgICAoZmxvdy0+b3BfdHlwZSA9PSBDUEhfVkxBTl9PUF9ESVNDQVJEKSkKKyAgICAgICAgdHhfc3BlY19vdXQtPnR4cSA9IE1WX0lOVkFMSURfUVVFVUVfTlVNOworICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChmbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCA8PCA4KXwweDAwMTApOworICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKKyAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3NlbmRfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgZGV2X291dCAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHBrdCAgICAgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0LCBzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKK3sKKworCisjaWYgMAorICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBNVl9FVEhfUFJJVihkZXZfb3V0KTsKKyAgICBpbnQgZnJhZ3MgPSAwOworICAgIGJvb2wgdHhfc3BlY19yZWFkeSA9IGZhbHNlOworICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyB0eF9zcGVjOworICAgIHUzMiB0eF9jbWQ7CisgICAgc3RydWN0IHR4X3F1ZXVlICp0eHFfY3RybCA9IE5VTEw7CisgICAgc3RydWN0IG5ldGFfdHhfZGVzYyAqdHhfZGVzYzsKKyAgICBzdHJ1Y3Qgc2tfYnVmZiAgKnNrYjsKKworCisgICAgc2tiID0gKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKTsKKworICAgIHJlYWRfbG9jaygmcHAtPnJ3bG9jayk7CisKKyAgICBpZiAoIShuZXRpZl9ydW5uaW5nKGRldl9vdXQpKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIiFuZXRpZl9ydW5uaW5nKCkgaW4gJXNcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogR2V0IFRYUSAod2l0aG91dCBCTSkgdG8gc2VuZCBwYWNrZXQgZ2VuZXJhdGVkIGJ5IExpbnV4ICovCisgICAgaWYgKHR4X3NwZWNfcmVhZHkgPT0gZmFsc2UpIHsKKyAgICAgICAgdHhfc3BlYy50eHAgICAgPSB0eF9zcGVjX291dC0+dHhwOworICAgICAgICB0eF9zcGVjLnR4cSAgICA9IHR4X3NwZWNfb3V0LT50eHE7CisgICAgICAgIHR4X3NwZWMuaHdfY21kID0gdHhfc3BlY19vdXQtPmh3X2NtZDsKKyAgICAgICAgdHhfc3BlYy5mbGFncyAgPSB0eF9zcGVjX291dC0+ZmxhZ3M7CisgICAgfQorCisgICAgdHhxX2N0cmwgPSAmcHAtPnR4cV9jdHJsW3R4X3NwZWMudHhwICogQ09ORklHX01WX0VUSF9UWFEgKyB0eF9zcGVjLnR4cV07CisgICAgaWYgKHR4cV9jdHJsID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogaW52YWxpZGF0ZSB0eHAvdHhxICglZC8lZClcbiIsIF9fZnVuY19fLCB0eF9zcGVjLnR4cCwgdHhfc3BlYy50eHEpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnR4cV9jdHJsLT5xdWV1ZV9sb2NrKTsKKworI2lmIDAKKyNpZmRlZiBDT05GSUdfTVZfRVRIX1RTTworICAgIC8qIEdTTy9UU08gKi8KKyAgICBpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisgICAgICAgIGZyYWdzID0gbXZfZXRoX3R4X3Rzbyhza2IsIGRldl9vdXQsICZ0eF9zcGVjLCB0eHFfY3RybCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1RTTyAqLworI2VuZGlmCisKKyAgICBmcmFncyA9IDE7CisKKyNpZiAwCisgICAgaWYgKHR4X3NwZWMuZmxhZ3MgJiBNVl9FVEhfRl9NSCkgeworICAgICAgICBpZiAodHhfc3BlYy5mbGFncyAmIE1WX0VUSF9GX1NXSVRDSCkKKyAgICAgICAgICAgIG1oID0gZGV2X3ByaXYtPnR4X3ZsYW5fbWg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1oID0gcHAtPnR4X21oOworCisgICAgICAgIGlmIChtdl9ldGhfc2tiX21oX2FkZChza2IsIG1oKSkgeworICAgICAgICAgICAgZnJhZ3MgPSAwOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICB0eF9kZXNjID0gbXZfZXRoX3R4X2Rlc2NfZ2V0KHR4cV9jdHJsLCBmcmFncyk7CisgICAgaWYgKHR4X2Rlc2MgPT0gTlVMTCkgeworICAgICAgICBmcmFncyA9IDA7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHR4X2NtZCA9IE5FVEFfVFhfTDRfQ1NVTV9OT1Q7CisKKyNpZmRlZiBDT05GSUdfTVZfUE9OCisgICAgdHhfZGVzYy0+aHdfY21kID0gdHhfc3BlYy5od19jbWQ7CisjZW5kaWYKKworICAgIC8qIEZJWE1FOiBiZXdhcmUgb2Ygbm9ubGluZWFyIC0tQksgKi8KKyAgICB0eF9kZXNjLT5kYXRhU2l6ZSA9IHNrYl9oZWFkbGVuKHNrYik7CisKKyAgICB0eF9kZXNjLT5idWZQaHlzQWRkciA9IG12T3NDYWNoZUZsdXNoKE5VTEwsIHNrYi0+ZGF0YSwgdHhfZGVzYy0+ZGF0YVNpemUpOworCisgICAgaWYgKGZyYWdzID09IDEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgYW5kIExhc3QgZGVzY3JpcHRvcgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHR4X3NwZWMuZmxhZ3MgJiBNVl9FVEhfRl9OT19QQUQpCisgICAgICAgICAgICB0eF9jbWQgfD0gTkVUQV9UWF9GX0RFU0NfTUFTSyB8IE5FVEFfVFhfTF9ERVNDX01BU0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR4X2NtZCB8PSBORVRBX1RYX0ZMWl9ERVNDX01BU0s7CisKKyAgICAgICAgdHhfZGVzYy0+Y29tbWFuZCA9IHR4X2NtZDsKKyAgICAgICAgbXZfZXRoX3R4X2Rlc2NfZmx1c2godHhfZGVzYyk7CisKKyAgICAgICAgdHhxX2N0cmwtPnNoYWRvd190eHFbdHhxX2N0cmwtPnNoYWRvd190eHFfcHV0X2ldID0gKChNVl9VTE9ORykgc2tiIHwgTVZfRVRIX1NIQURPV19TS0IpOworICAgICAgICBtdl9ldGhfc2hhZG93X2luY19wdXQodHhxX2N0cmwpOworICAgIH0gCisKKyAgICB0eHFfY3RybC0+dHhxX2NvdW50ICs9IGZyYWdzOworCisjaWZkZWYgQ09ORklHX01WX0VUSF9ERUJVR19DT0RFCisgICAgaWYgKHBwLT5mbGFncyAmIE1WX0VUSF9GX0RCR19UWCkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiJXMgLSBldGhfdHhfJWx1OiBwb3J0PSVkLCB0eHA9JWQsIHR4cT0lZCwgc2tiPSVwLCBoZWFkPSVwLCBkYXRhPSVwLCBzaXplPSVkXG4iLAorICAgICAgICAgICAgICAgZGV2X291dC0+bmFtZSwgZGV2X291dC0+c3RhdHMudHhfcGFja2V0cywgcHAtPnBvcnQsIHR4X3NwZWMudHhwLCB0eF9zcGVjLnR4cSwgc2tiLAorICAgICAgICAgICAgICAgc2tiLT5oZWFkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKyAgICAgICAgbXZfZXRoX3R4X2Rlc2NfcHJpbnQodHhfZGVzYyk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfREVCVUdfQ09ERSAqLworCisjaWZkZWYgQ09ORklHX01WX1BPTgorICAgIGlmIChNVl9QT05fUE9SVChwcC0+cG9ydCkpCisgICAgICAgIG12TmV0YVBvblR4cUJ5dGVzQWRkKHBwLT5wb3J0LCB0eF9zcGVjLnR4cCwgdHhfc3BlYy50eHEsIHNrYi0+bGVuKTsKKyNlbmRpZiAvKiBDT05GSUdfTVZfUE9OICovCisKKyAgICAvKiBFbmFibGUgdHJhbnNtaXQgKi8KKyAgICBtdk5ldGFUeHFQZW5kRGVzY0FkZChwcC0+cG9ydCwgdHhfc3BlYy50eHAsIHR4X3NwZWMudHhxLCBmcmFncyk7CisKKyAgICBTVEFUX0RCRyh0eHFfY3RybC0+c3RhdHMudHhxX3R4ICs9IGZyYWdzKTsKKworb3V0OgorICAgIGlmIChmcmFncyA+IDApIHsKKyAgICAgICAgZGV2X291dC0+c3RhdHMudHhfcGFja2V0cysrOworICAgICAgICBkZXZfb3V0LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZfb3V0LT5zdGF0cy50eF9kcm9wcGVkKys7CisgICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7CisgICAgfQorCisjaWZuZGVmIENPTkZJR19NVl9FVEhfVFhET05FX0lTUgorICAgIGlmICh0eHFfY3RybCkgeworICAgICAgICBpZiAodHhxX2N0cmwtPnR4cV9jb3VudCA+PSBtdl9jdHJsX3R4ZG9uZSkgeworICAgICAgICAgICAgdTMyIHR4X2RvbmUgPSBtdl9ldGhfdHhxX2RvbmUocHAsIHR4cV9jdHJsKTsKKworICAgICAgICAgICAgU1RBVF9ESVNUKCh0eF9kb25lIDwgcHAtPmRpc3Rfc3RhdHMudHhfZG9uZV9kaXN0X3NpemUpID8gcHAtPmRpc3Rfc3RhdHMudHhfZG9uZV9kaXN0W3R4X2RvbmVdKysgOiAwKTsKKworICAgICAgICB9CisgICAgICAgIC8qIElmIGFmdGVyIGNhbGxpbmcgbXZfZXRoX3R4cV9kb25lLCB0eHFfY3RybC0+dHhxX2NvdW50IGVxdWFscyBmcmFncywgd2UgbmVlZCB0byBzZXQgdGhlIHRpbWVyICovCisgICAgICAgIGlmICgodHhxX2N0cmwtPnR4cV9jb3VudCA9PSBmcmFncykgJiYgKGZyYWdzID4gMCkpCisgICAgICAgICAgICBtdl9ldGhfYWRkX3R4X2RvbmVfdGltZXIocHApOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1RYRE9ORV9JU1IgKi8KKworICAgIGlmICh0eHFfY3RybCkKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHhxX2N0cmwtPnF1ZXVlX2xvY2spOworCisgICAgcmVhZF91bmxvY2soJnBwLT5yd2xvY2spOworCisjZW5kaWYgICAgCisgICAgcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2xvb2t1cF9vcF90eXBlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046bG9va3VwIG9wZXJhdGlvbiB0eXBlIHN0cmluZyBhY2NvcmRpbmcgdG8gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBlbnVtX3ZhbHVlIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoSU5UMzIgZW51bV92YWx1ZSkKK3sKKyAgICByZXR1cm4gbXR5cGVfbG9va3VwX2VudW1fc3RyKCZnX2VudW1fYXJyYXlfb3BfdHlwZSwgZW51bV92YWx1ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGlzcGxheV9hbGwoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRpc3BsYXlzIHZhbGlkIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCisqICAgICAgICAgICAgICB0byBQLWJpdHMgbWFwcGluZyB0YWJsZWZvciB1bnRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2Rpc3BsYXlfYWxsIChWT0lEKQoreworICAgIFVJTlQzMiAgICAgICAgICAgIGlkeCAgICAgICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICAgICBydWxlX2lkeCAgICA9IDA7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCAqcF9mbG93X3J1bGUgPSBOVUxMOworICAgIElOVDMyICAgICAgICAgICAgIG9mZnNldCAgICAgID0gMDsKKyAgICBVSU5UOCAgICAgICAgICAgICBidWZmWzUxMl07CisKKyAgICAvKiBQcmludCBmbG93IHJ1bGUgZW50cmllcyAqLworICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NQSCBGbG93IFJ1bGUgVGFibGVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50ayhLRVJOX0lORk8gIlRvdGFsIHJ1bGUgbnVtYmVyOiVkLCBNYXggcnVsZSBudW1iZXI6JWQgXG4iLCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtLCBDUEhfRkxPV19FTlRSWV9OVU0pOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRrKEtFUk5fSU5GTyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UGFyc2Ugb3V0ZXIgICAgICAgfFBhcnNlIGlubmVyICAgICAgIHxNb2Qgb3V0ZXIgICAgICAgICB8TW9kIElubmVyICAgICAgICAgfEZvcndhcmRcbiIpOworICAgIHByaW50ayhLRVJOX0lORk8gImRpciBkZWZhdWx0IHBhcnNlX2JtIG1oICAgZXR5ICAgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICBwb3J0IHF1ZXVlIGh3Zl9xdWV1ZSBnZW0gIGNvdW50ICAgIG9wX3R5cGVcbiIpOworICAgIC8qIFRyYXZlcnNlIENQSCBmbG93IHJ1bGUgdGFsZSAqLworICAgIGZvciAoaWR4ID0gMCwgcnVsZV9pZHggPSAwOyAoaWR4IDwgQ1BIX0ZMT1dfRU5UUllfTlVNKSAmJiAocnVsZV9pZHggPCBnc19mbG93X3RhYmxlLnJ1bGVfbnVtKTsgaWR4KyspCisgICAgeworICAgICAgICBwX2Zsb3dfcnVsZSA9ICZnc19mbG93X3RhYmxlLmZsb3dfcnVsZVtpZHhdOworICAgICAgICAKKyAgICAgICAgLyogQ29tcGFyZSBwYXJzZV9ibSBhbmQgcGFyc2Vfa2V5ICovCisgICAgICAgIGlmIChwX2Zsb3dfcnVsZS0+dmFsaWQgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgcnVsZV9pZHgrKzsKKworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAgCisgICAgICAgICAgICAgICAgICAgIiUyLjJzICAlMy4zcyAgICAgMHglMDR4ICAgJS00ZCAweCUwNHggMHglMDR4ICUtNGQgJTFkICAgICAgMHglMDR4ICUtNGQgJTFkICAgICAgMHglMDR4ICUtNGQgJTFkICAgICAgMHglMDR4ICUtNGQgJTFkICAgICAgJTFkICAgICUxZCAgICAgJTFkICAgICAgICAgJS00ZCAlLThkICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGNwaF9hcHBfbG9va3VwX2RpcihwX2Zsb3dfcnVsZS0+ZGlyKSwgKHBfZmxvd19ydWxlLT5pc19kZWZhdWx0ID09IFRSVUUpPyAiWWVzIjoiTm8gIiwgCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPnBhcnNlX2JtLCAgICAgICAgICAgICBwX2Zsb3dfcnVsZS0+bWgsICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPmV0aF90eXBlLAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5wYXJzZV9vdXRlcl90Y2kudHBpZCwgcF9mbG93X3J1bGUtPnBhcnNlX291dGVyX3RjaS52aWQsIHBfZmxvd19ydWxlLT5wYXJzZV9vdXRlcl90Y2kucGJpdHMsIAorICAgICAgICAgICAgICAgICAgIHBfZmxvd19ydWxlLT5wYXJzZV9pbm5lcl90Y2kudHBpZCwgcF9mbG93X3J1bGUtPnBhcnNlX2lubmVyX3RjaS52aWQsIHBfZmxvd19ydWxlLT5wYXJzZV9pbm5lcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPm1vZF9vdXRlcl90Y2kudHBpZCwgICBwX2Zsb3dfcnVsZS0+bW9kX291dGVyX3RjaS52aWQsICAgcF9mbG93X3J1bGUtPm1vZF9vdXRlcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPm1vZF9pbm5lcl90Y2kudHBpZCwgICBwX2Zsb3dfcnVsZS0+bW9kX2lubmVyX3RjaS52aWQsICAgcF9mbG93X3J1bGUtPm1vZF9pbm5lcl90Y2kucGJpdHMsCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPnBrdF9mcndkLnRyZ19wb3J0LCAgICBwX2Zsb3dfcnVsZS0+cGt0X2Zyd2QudHJnX3F1ZXVlLCAgcF9mbG93X3J1bGUtPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsIHBfZmxvd19ydWxlLT5wa3RfZnJ3ZC5nZW1fcG9ydCwgCisgICAgICAgICAgICAgICAgICAgcF9mbG93X3J1bGUtPmNvdW50LCAgICAgICAgICAgICAgICBjcGhfZmxvd19sb29rdXBfb3BfdHlwZShwX2Zsb3dfcnVsZS0+b3BfdHlwZSkpOworICAgICAgICB9CisgICAgfSAgIAorCisgICAgLyogUHJpbnQgIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KKyAgICBwcmludGsoS0VSTl9JTkZPICJcbk1WX0NQSCBEU0NQIHRvIFAtYml0cyBNYXBwaW5nIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgIAorICAgIGlmIChnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPT0gMCkgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJObyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gIkRTQ1BbUGJpdHNdXG4iKTsKKworICAgICAgICBtZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBNVl9DUEhfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRTsgaWR4KyspIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZmYrb2Zmc2V0LCAiJTIuMmRbJTIuMmRdICIsIGlkeCwgZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbaWR4XSk7CisgICAgICAgICAgICBpZiAoKChpZHgrMSkgJSAxNikgPT0gMCkKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc3ByaW50ZihidWZmK29mZnNldCwgIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsIGJ1ZmYpOworICAgIH0KKyAgICBwcmludGsoS0VSTl9JTkZPICJcbiIpOworIAorICAgIHJldHVybiBNVl9PSzsgCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyBDUEggZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlLgorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19pbml0KFZPSUQpCit7CisgICAgTVZfU1RBVFVTIHJjID0gTVZfT0s7CisKKyAgICByYyA9IGNwaF9mbG93X2RiX2luaXQoKTsKKyAgICBDSEVDS19BUElfUkVUVVJOX0FORF9MT0dfRVJST1IocmMsICJGYWlsIHRvIGNhbGwgY3BoX2Zsb3dfZGJfaW5pdCIpOworICAgICAgICAKKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfZmxvdy5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjY1NmYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2Zsb3cuaApAQCAtMCwwICsxLDU5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9mbG93LmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgZmxvdyBtb2R1bGUgdG8gaGFuZGxlIHRoZSAKKyogICAgICAgICAgICAgIGZsb3cgbWFwcGluZywgVkxBTiBtb2RpZmljYXRpb24gb2YgZGF0YSB0cmFmZmljCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAxMkRlYzIwMTEKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9GTE9XX0hfCisjZGVmaW5lIF9NVl9DUEhfRkxPV19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgRW51bSBhbmQgU3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfQ1BIX1RQSURfTk9UX0NBUkVfVkFMVUUgICAgICAgKDApICAgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBUUElEICAgICAqLworI2RlZmluZSBNVl9DUEhfVklEX05PVF9DQVJFX1ZBTFVFICAgICAgICAoNDA5NikgIC8qIERvZXMgbm90IGNhcmUgZm9yIFZJRCAgICAgICovCisjZGVmaW5lIE1WX0NQSF9QQklUU19OT1RfQ0FSRV9WQUxVRSAgICAgICg4KSAgICAgLyogRG9lcyBub3QgY2FyZSBmb3IgUC1iaXRzICAgKi8KKyNkZWZpbmUgTVZfQ1BIX0RTQ1BfTk9UX0NBUkVfVkFMVUUgICAgICAgKDY0KSAgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBEU0NQICAgICAqLworCisjZGVmaW5lIE1WX0NQSF9UUElEX0lOVkFMSURfVkFMVUUgICAgICAgICgweEZGRkYpLyogTm8gdmFsaWQgVFBJRCAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTVZfQ1BIX1ZJRF9JTlZBTElEX1ZBTFVFICAgICAgICAgKDB4RkZGRikvKiBObyB2YWxpZCBWSUQgICAgICAgICAgICAgICAqLworI2RlZmluZSBNVl9DUEhfUEJJVFNfSU5WQUxJRF9WQUxVRSAgICAgICAoMHhGRikgIC8qIE5vIHZhbGlkIFAtYml0cyAgICAgICAgICAgICovCisjZGVmaW5lIE1WX0NQSF9EU0NQX0lOVkFMSURfVkFMVUUgICAgICAgICgweEZGKSAgLyogTm8gdmFsaWQgRFNDUCAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBNVl9DUEhfREVGQVVMVF9VTlRBR19SVUxFICAgICAgICAoNDA5NisxKS8qIERlZmF1bHQgdW50YWdnZWQgIHJ1bGUgICAgICovCisjZGVmaW5lIE1WX0NQSF9ERUZBVUxUX1NJTkdMRV9UQUdfUlVMRSAgICg0MDk2KzIpLyogRGVmYXVsdCBzaW5sZ2UgdGFnZ2VkICBydWxlKi8KKyNkZWZpbmUgTVZfQ1BIX0RFRkFVTFRfRE9VQkxFX1VOVEFHX1JVTEUgKDQwOTYrMykvKiBEZWZhdWx0IGRvdWJsZSB0YWdnZWQgIHJ1bGUqLworCisvKiBDUEggZmxvdyBtYXBwaW5nIHJ1bGUgZGVmaW5pdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bQoreworICAgIENQSF9WTEFOX09QX0FTSVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgIENQSF9WTEFOX09QX0RJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxLCAgICAgIAorICAgIENQSF9WTEFOX09QX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyLCAgCisgICAgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfRFNDUCAgICAgICAgICAgICAgICAgICAgICA9IDMsCisgICAgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfT1VURVJfUEJJVCAgICAgICAgICAgICAgICA9IDQsCisgICAgQ1BIX1ZMQU5fT1BfQUREX0NPUFlfSU5ORVJfUEJJVCAgICAgICAgICAgICAgICA9IDUsCisgICAgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDYsCisgICAgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX0RTQ1AgICAgICAgICAgICAgICA9IDcsCisgICAgQ1BIX1ZMQU5fT1BfQUREXzJfVEFHU19DT1BZX1BCSVQgICAgICAgICAgICAgICA9IDgsCisgICAgQ1BIX1ZMQU5fT1BfUkVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksCisgICAgQ1BIX1ZMQU5fT1BfUkVNXzJfVEFHUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDEwLAorICAgIENQSF9WTEFOX09QX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMSwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFX1ZJRCAgICAgICAgICAgICAgICAgICAgICAgID0gMTIsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9QQklUICAgICAgICAgICAgICAgICAgICAgICA9IDEzLAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfSU5ORVJfQUREX09VVEVSICAgICAgICAgICAgPSAxNCwKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFX0lOTkVSX0FERF9PVVRFUl9DT1BZX1BCSVQgID0gMTUsCisgICAgQ1BIX1ZMQU5fT1BfUkVQTEFDRV9JTk5FUl9SRU1fT1VURVIgICAgICAgICAgICA9IDE2LAorICAgIENQSF9WTEFOX09QX1JFUExBQ0VfMlRBR1MgICAgICAgICAgICAgICAgICAgICAgPSAxNywKKyAgICBDUEhfVkxBTl9PUF9SRVBMQUNFXzJUQUdTX1ZJRCAgICAgICAgICAgICAgICAgID0gMTgsCisgICAgQ1BIX1ZMQU5fT1BfU1dBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE5Cit9IENQSF9WTEFOX09QX1RZUEVfRTsKKwordHlwZWRlZiBzdHJ1Y3QgY3BoX2Zsb3dfZnJ3ZCB7CisgICAgVUlOVDggIHRyZ19wb3J0OworICAgIFVJTlQ4ICB0cmdfcXVldWU7CisgICAgVUlOVDggIHRyZ19od2ZfcXVldWU7CisgICAgVUlOVDE2IGdlbV9wb3J0OworfSBDUEhfRkxPV19GUldEX1Q7CisKK3R5cGVkZWYgc3RydWN0IGNwaF9mbG93X3RjaSB7CisgICAgVUlOVDE2ICB0cGlkOworICAgIFVJTlQxNiAgdmlkOworICAgIFVJTlQ4ICAgcGJpdHM7Cit9IENQSF9GTE9XX1RDSV9UOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBDUEhfRkxPV19QQVJTRV9NSCAgICAgICAgPSAweDAxLCAgLyogcGFyc2luZyBNYXJ2ZWxsIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDUEhfRkxPV19QQVJTRV9FWFRfVkxBTiAgPSAweDAyLCAgLyogcGFyc2luZyBleHRlcm5hbCBWTEFOIHRhZyAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDUEhfRkxPV19QQVJTRV9UV09fVkxBTiAgPSAweDA0LCAgLyogcGFyc2luZyBib3RoIG9mIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBWTEFOIHRhZ3MgKi8KKyAgICBDUEhfRkxPV19QQVJTRV9FVEhfVFlQRSAgPSAweDA4LCAgLyogcGFyc2luZyBFdGhlcm5ldCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBDUEhfRkxPV19QQVJTRV9NQ19QUk9UTyAgPSAweDEwLCAgLyogcGFyc2luZyBtdWx0aWNhc3QgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgKi8KK30gQ1BIX0ZMT1dfUEFSU0VfRTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBCT09MICAgICAgICAgICAgICAgdmFsaWQ7CisgICAgQ1BIX0RJUl9FICAgICAgICAgIGRpcjsKKyAgICBDUEhfRkxPV19QQVJTRV9FICAgcGFyc2VfYm07CisgICAgQk9PTCAgICAgICAgICAgICAgIGlzX2RlZmF1bHQ7CisgICAgVUlOVDE2ICAgICAgICAgICAgIG1oOworICAgIENQSF9GTE9XX1RDSV9UICAgICBwYXJzZV9vdXRlcl90Y2k7CisgICAgQ1BIX0ZMT1dfVENJX1QgICAgIHBhcnNlX2lubmVyX3RjaTsKKyAgICBVSU5UMTYgICAgICAgICAgICAgZXRoX3R5cGU7CisgICAgQ1BIX1ZMQU5fT1BfVFlQRV9FIG9wX3R5cGU7CisgICAgQ1BIX0ZMT1dfVENJX1QgICAgIG1vZF9vdXRlcl90Y2k7CisgICAgQ1BIX0ZMT1dfVENJX1QgICAgIG1vZF9pbm5lcl90Y2k7CisgICAgQ1BIX0ZMT1dfRlJXRF9UICAgIHBrdF9mcndkOworICAgIFVJTlQzMiAgICAgICAgICAgICBjb3VudDsKK30gQ1BIX0ZMT1dfRU5UUllfVDsKKworI2RlZmluZSBDUEhfRkxPV19FTlRSWV9OVU0gICAoNTEyKQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgICAgICAgICAgICBydWxlX251bTsKKyAgICBzcGlubG9ja190ICAgICAgICAgZmxvd19sb2NrOworICAgIENQSF9GTE9XX0VOVFJZX1QgICBmbG93X3J1bGVbQ1BIX0ZMT1dfRU5UUllfTlVNXTsKK30gQ1BIX0ZMT1dfVEFCTEVfVDsKKworLyogRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSBkZWZpbml0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNVl9DUEhfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRSAgKDY0KQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiBpbl91c2U7CisgICAgVUlOVDggIHBiaXRzW01WX0NQSF9EU0NQX1BCSVRTX1RBQkxFX01BWF9TSVpFXTsKK30gQ1BIX0RTQ1BfUEJJVFNfVDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2FkZF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfYWRkX3J1bGUoQ1BIX0ZMT1dfRU5UUllfVCAqY3BoX2Zsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X2RlbF9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgZmxvdyBtYXBwaW5nIHJ1bGUKKyoKKyogSU5QVVRTOgorKiAgICAgICBjcGhfZmxvdyAtIFZMQU4gSUQsIDgwMi4xcCB2YWx1ZSwgcGt0X2Z3ZCBpbmZvcm1hdGlvbi4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgIGNwaF9mbG93X2RlbF9ydWxlKENQSF9GTE9XX0VOVFJZX1QgKmNwaF9mbG93KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jbGVhcl9ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfY2xlYXJfcnVsZShWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENsZWFycyBmbG93IG1hcHBpbmcgcnVsZXMgYnkgTUgKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgIC0gIE1hcnZlbGwgaGVhZGVyLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19jbGVhcl9ydWxlX2J5X21oKFVJTlQxNiBtaCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZ2V0X3RhZ19ydWxlKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEdldHMgZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCisqCisqIElOUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBJbnB1dCB2aWQsIHBiaXRzLCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgY3BoX2Zsb3cgLSBvdXRwdXQgcGFja2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBHRU0gcG9ydCwgCisqICAgICAgICAgICAgICAgICAgVC1DT05ULCBxdWV1ZSBhbmQgcGFja2V0IG1vZGlmaWNhdGlvbiBmb3IgVklELCBQLWJpdHMuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyICBjcGhfZmxvd19nZXRfcnVsZShDUEhfRkxPV19FTlRSWV9UICpjcGhfZmxvdyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfc2V0X2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFNldHMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIGRzY3BfbWFwICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X3NldF9kc2NwX21hcChDUEhfRFNDUF9QQklUU19UICpkc2NwX21hcCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX2RzY3BfbWFwKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IERlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcworKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9mbG93X2RlbF9kc2NwX21hcChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19hZGRfdmxhbigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBBZGQgb25lIFZMQU4gdGFnIGJlaGluZCBvZiBzb3VyY2UgTUFDIGFkZHJlc3MuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIHRwaWQgICAtIFR5cGUgb2YgVkxBTiBJRAorKiAgICAgICB2aWQgICAgLSBWTEFOIHRvIGJlIGFkZGVkCisqICAgICAgIHBiaXRzICAtIFAtYml0cyB2YWx1ZQorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBUaGUgc2hpZnQgb2YgU0tCIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5MSU5FIElOVDMyIGNwaF9mbG93X2FkZF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfZGVsX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIG9uZSBWTEFOIHRhZyBiZWhpbmQgb2Ygc291cmNlIE1BQyBhZGRyZXNzLgorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAgICAtIFdoZXRoZXIgaGFzIE1IIG9yIG5vdAorKiAgICAgICBwX2RhdGEgLSBQb2ludGVyIHRvIHBhY2tldC4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgVGhlIHNoaWZ0IG9mIFNLQiBkYXRhLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOTElORSBJTlQzMiBjcGhfZmxvd19kZWxfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19yZXBsYWNlX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogUmVwbGFjZSBvbmUgVkxBTiB0YWcgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQKKyogICAgICAgdHBpZCAgIC0gVHlwZSBvZiBWTEFOIElECisqICAgICAgIHZpZCAgICAtIFZMQU4gdG8gYmUgYWRkZWQKKyogICAgICAgcGJpdHMgIC0gUC1iaXRzIHZhbHVlCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfcmVwbGFjZV92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEsIFVJTlQxNiB0cGlkLCBVSU5UMTYgdmlkLCBVSU5UOCBwYml0cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfc3dhcF92bGFuKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IFN3YXAgYmV0d2VlbiB0d28gVkxBTiB0YWcuCisqCisqIElOUFVUUzoKKyogICAgICAgbWggICAgIC0gV2hldGhlciBoYXMgTUggb3Igbm90CisqICAgICAgIHBfZGF0YSAtIFBvaW50ZXIgdG8gcGFja2V0CisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3dhcF92bGFuKEJPT0wgbWgsIFVJTlQ4ICpwX2RhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3N0cmlwX3ZsYW4oKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogRGVsZXRlIGFsbCBWTEFOIHRhZ3MgYmVoaW5kIG9mIHNvdXJjZSBNQUMgYWRkcmVzcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgcF9kYXRhIC0gUG9pbnRlciB0byBwYWNrZXQuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIFRoZSBzaGlmdCBvZiBTS0IgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTkxJTkUgSU5UMzIgY3BoX2Zsb3dfc3RyaXBfdmxhbihCT09MIG1oLCBVSU5UOCAqcF9kYXRhKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3J1bGVzKCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENvbXBhcnNlIHR3byBmbG93IHJ1bGVzLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhcnNlX3J1bGUgIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3J1bGVzIChDUEhfRkxPV19FTlRSWV9UICpwYXJzZV9ydWxlLCBDUEhfRkxPV19FTlRSWV9UICpkYl9ydWxlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDb21wYXJlIGZsb3cgcGFja2V0IGFuZCBydWxlLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBhY2tldF9ydWxlIC0gVGhlIHBhcnNpbmcgZmllbGQgdmFsdWVzIGNvbWUgZnJvbSB0aGUgcGFja2V0cworKiAgICAgICBkYl9ydWxlICAgICAtIFRoZSBmbG93IHJ1bGUgc3RvcmVkIGluIGZsb3cgZGF0YWJhc2UKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgSW4gY2FzZSBzYW1lLCByZXR1cm4gVFJVRSwgCisqICAgICAgIEluIGNhc2UgZGlmZmVyZW50LCByZXR1cm4gRkFMU0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQk9PTCBjcGhfZmxvd19jb21wYXJlX3BhY2tldF9hbmRfcnVsZSAoQ1BIX0ZMT1dfRU5UUllfVCAqcGFja2V0X3J1bGUsIENQSF9GTE9XX0VOVFJZX1QgKmRiX3J1bGUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3BhcnNlX3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBQYXJzZSBwYWNrZXQgYW5kIG91dHB1dCBmbG93IGluZm9ybWF0aW9uLgorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgLSBTb3VyY2UgR01BQyBwb3J0CisqICAgICAgIGRhdGEgLSBQb2ludGVyIHRvIHBhY2tldAorKiAgICAgICByeCAgIC0gV2hldGhlciBpbiBSWCBkaXIKKyoKKyogT1VUUFVUUzoKKyogICAgICAgZmxvdyAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X3BhcnNlX3BhY2tldCAoSU5UMzIgcG9ydCwgVUlOVDggKmRhdGEsIEJPT0wgcngsIEJPT0wgbWgsIENQSF9GTE9XX0VOVFJZX1QgKmZsb3cpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X21vZF9wYWNrZXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IHBhY2tldCBhY2NvcmRpbmcgdG8gZmxvdyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgc2tiICAgICAgICAtIFBvaW50ZXIgdG8gcGFja2V0CisqICAgICAgIG1oICAgICAgICAgLSBXaGV0aGVyIGhhcyBNSCBvciBub3QKKyogICAgICAgZmxvdyAgICAgICAtIEZsb3cgcGFyc2luZyBmaWVsZCB2YWx1ZXMKKyogICAgICAgb3V0X29mZnNldCAtIE9mZnNldCBvZiBwYWNrZXQKKyogICAgICAgcnggICAgICAgICAtIFdoZXRoZXIgUlggb3IgVFgKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X21vZF9wYWNrZXQgKHN0cnVjdCBza19idWZmICpza2IsICBCT09MIG1oLCBDUEhfRkxPV19FTlRSWV9UICpmbG93LCBJTlQzMiAqb3V0X29mZnNldCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfbW9kX2Zyd2QoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogTW9kaWZ5IGZvcndhcmRpbmcgcGFyYW1ldGVyIG9mIHRyYW5zbWl0aW5nIHBhY2tldCBhY2NvcmRpbmcgdG8gZmxvdyBydWxlCisqCisqIElOUFVUUzoKKyogICAgICAgZmxvdyAgICAgICAgLSBGbG93IHBhcnNpbmcgZmllbGQgdmFsdWVzCisqICAgICAgIHR4X3NwZWNfb3V0IC0gVFggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgY3BoX2Zsb3dfbW9kX2Zyd2QgKENQSF9GTE9XX0VOVFJZX1QgKmZsb3csIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9mbG93X3NlbmRfcGFja2V0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IENQSCBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIHJlY2VpdmVkIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgZGV2X291dCAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHBrdCAgICAgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGNwaF9mbG93X3NlbmRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0LCAgc3RydWN0IGV0aF9wYnVmICpwa3QsCisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgb3BlcmF0aW9uIHR5cGUgc3RyaW5nIGFjY29yZGluZyB0byB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIGVudW1fdmFsdWUgLSBUaGUgZW51bSB2YWx1ZSB0byBiZSBtYXRjaGVkCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUKKyoKKyogUkVUVVJOUzoKKyogICAgICAgRW51bSBzdHJpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDSEFSICpjcGhfZmxvd19sb29rdXBfb3BfdHlwZShJTlQzMiBlbnVtX3ZhbHVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19kaXNwbGF5X2FsbCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGlzcGxheXMgdmFsaWQgZmxvdyBtYXBwaW5nIHRhYmxlcyBhbmQgRFNDUCAKKyogICAgICAgICAgICAgIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlZm9yIHVudGFnZ2VkIGZyYW1lcy4KKyoKKyogSU5QVVRTOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBNVl9PSy4gCisqICAgICAgIE9uIGVycm9yIHJldHVybnMgZXJyb3IgY29kZSBhY2NvcmRpbmdseS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJTlQzMiBjcGhfZmxvd19kaXNwbGF5X2FsbChWT0lEKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfZmxvd19pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemVzIENQSCBmbG93IG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2Zsb3dfaW5pdChWT0lEKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9NVl9DUEhfRkxPV19NQVBfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9oZWFkZXIuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9oZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kY2ZkZTUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2hlYWRlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfaGVhZGVyLmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgaGVhZGVyIGZpbGUKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4wCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX0hFQURFUl9IXworI2RlZmluZSBfTVZfQ1BIX0hFQURFUl9IXworCisvKiBJbmNsdWRlIEZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgPG12Q29tbW9uLmg+CisjaW5jbHVkZSA8bXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5oPgorCisjaW5jbHVkZSAibXZfY3BoX2luZnJhLmgiCisjaW5jbHVkZSAibXZfY3BoX2FwcC5oIgorI2luY2x1ZGUgIm12X2NwaF9mbG93LmgiCisjaW5jbHVkZSAibXZfY3BoX2RiLmgiCisjaW5jbHVkZSAibXZfY3BoX2FwaS5oIgorI2luY2x1ZGUgIm12X2NwaF9tbmdfaWYuaCIKKyNpbmNsdWRlICJtdl9jcGhfZGV2LmgiCisjaW5jbHVkZSAibXZfY3BoX25ldGRldi5oIgorI2luY2x1ZGUgIm12X2NwaF9zeXNmcy5oIgorCisjZW5kaWYgLyogX01WX0NQSF9IRUFERVJfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX2luZnJhLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTRiMjk1YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCAKK0ludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworYWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCitGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCitpbnRyb2R1Y3Rvcnkgc3RhdGVtZW50IHJlZ2FyZGluZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgKGlpKSBkZWxldGUgdGhlIHR3bworbGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCitsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAordG8geW91IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgYXBwbGljYWJsZSBDb21tZXJjaWFsIExpY2Vuc2UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsIAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzIAorYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZSAKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IgCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4gCisKK1RIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZIAorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eSAKK2Rpc2NsYWltZXIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuIAorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCithcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIAorICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAorICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICAgIAorVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCAKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSAKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IAorTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIAorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyAKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfY3BoX2luZnJhLmMKKyoKKyogREVTQ1JJUFRJT046IEluY2x1ZGUgdXNlciBzcGFjZSBpbmZyYXN0cnVjdHVyZSBtb2R1bGVzIGRlZmluaXRpb25zCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKworI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmFyaWFibGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDSEFSIGdfdW5rbm93bl9zdHJbXSA9ICI8dW5rbm93bj4iOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbiBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtaW5kZXhfdHBtX3NyY190b19hcHBfcG9ydCgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgVFBNIHNvdXJjZSBwb3J0IHRvIGFwcGxpY2F0aW9uIFVOSSBwb3J0IAorKgorKiBJTlBVVFM6CisqICAgICAgIHNyY19wb3J0ICAgIC0gVFBNIHNvdXJjZSBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIEFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4CisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4LiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJuIGludmFsaWQgYXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXguCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQVBQX0VUSF9QT1JUX1VOSV9FIG1pbmRleF90cG1fc3JjX3RvX2FwcF9wb3J0KHRwbV9zcmNfcG9ydF90eXBlX3Qgc3JjX3BvcnQpCit7CisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV9FIGFwcF9wb3J0ID0gTVZfQVBQX0VUSF9QT1JUX0lOVkFMSUQ7CisKKyAgICAvKiBTaG91bGQgbW9kaWZ5IGJlbG93IGNvZGUgaW4gY2FzZSBzdXBwb3J0IG1vcmUgdGhhbiBmb3VyIFVOSSBwb3J0cyAqLworICAgIGlmIChzcmNfcG9ydCA8PSBUUE1fU1JDX1BPUlRfVU5JXzMpCisgICAgeworICAgICAgICBhcHBfcG9ydCA9IE1WX0FQUF9FVEhfUE9SVF9JTkRFWF9NSU4gKyAoc3JjX3BvcnQgLSBUUE1fU1JDX1BPUlRfVU5JXzApOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gYXBwX3BvcnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWluZGV4X21oX3RvX2FwcF9sbGlkKCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBNYXJ2ZWxsIGhlYWRlciB0byBhcHBsaWNhdGlvbiBMTElEIAorKgorKiBJTlBVVFM6CisqICAgICAgIG1oICAtIE1hcnZlbGwgaGVhZGVyCisqCisqIE9VVFBVVFM6CisqICAgICAgIEFwcGxpY2F0aW9uIExMSUQKKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYXBwbGljYXRpb24gTExJRC4gCisqICAgICAgIE9uIGVycm9yIHJldHVybiBpbnZhbGlkIGFwcGxpY2F0aW9uIExMSUQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVENPTlRfTExJRF9FIG1pbmRleF9taF90b19hcHBfbGxpZChVSU5UMTYgbWgpCit7CisgICAgTVZfVENPTlRfTExJRF9FIGxsaWQgICAgICAgPSBNVl9UQ09OVF9MTElEX0lOVkFMSUQ7CisgICAgVUlOVDggICAgICAgICAgIGxsaWRfaW5kZXggPSAwOworCisgICAgbGxpZF9pbmRleCA9IChtaCA+PiA4KSAmIDB4MGY7CisgICAgCisgICAgaWYgKGxsaWRfaW5kZXggPiAwKQorICAgIHsKKyAgICAgICAgaWYgKDB4MGYgPT0gbGxpZF9pbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgbGxpZCA9IE1WX1RDT05UX0xMSURfQlJPQURDQVNUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbGxpZCA9IGxsaWRfaW5kZXggLTE7CisgICAgICAgICAgICBpZihsbGlkID4gTVZfVENPTlRfTExJRF83KQorICAgICAgICAgICAgICAgIGxsaWQgPSBNVl9UQ09OVF9MTElEX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGxsaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXR5cGVfZ2V0X2RpZ2l0X251bSgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgY2hhcmFjdGVyIHN0cmluZyB0byBkaWdpdGFsIG51bWJlciAKKyoKKyogSU5QVVRTOgorKiAgICAgICBzdHIgICAtIENoYXJhY3RlciBzdHJpbmcKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBEaWdpdGFsIG51bWJlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworVUlOVDMyIG10eXBlX2dldF9kaWdpdF9udW0oY29uc3QgQ0hBUiAgKnN0cikKK3sKKyAgICBVSU5UMzIgIHZhbCA9IDA7CisKKyAgICBpZiAoKHN0clsxXSA9PSAneCcpIHx8IChzdHJbMV0gPT0gJ1gnKSkKKyAgICAgICAgc3NjYW5mKCZzdHJbMl0sICIleCIsICZ2YWwpOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAxMCk7CisKKyAgICByZXR1cm4gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG10eXBlX2xvb2t1cF9lbnVtX3N0cigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOmxvb2t1cCBlbnVtIHN0cmluZyBhY2NvcmRpbmcgdG8gZW51bSB2YWx1ZQorKgorKiBJTlBVVFM6CisqICAgICAgIHBfZW51bV9hcnJheSAgIC0gUG9pbnRlciB0byBlbnVtIGFycmF5CisqICAgICAgIGVudW1fdmFsdWUgICAgIC0gVGhlIGVudW0gdmFsdWUgdG8gYmUgbWF0Y2hlZAorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIEVudW0gc3RyaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworQ0hBUiAqbXR5cGVfbG9va3VwX2VudW1fc3RyKE1WX0VOVU1fQVJSQVlfVCAqcF9lbnVtX2FycmF5LCBJTlQzMiBlbnVtX3ZhbHVlKQoreworICAgIElOVDMyIGlkeDsKKyAgICAKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBfZW51bV9hcnJheS0+ZW51bV9udW07IGlkeCsrKQorICAgIHsKKyAgICAgICAgaWYgKGVudW1fdmFsdWUgPT0gcF9lbnVtX2FycmF5LT5lbnVtX2FycmF5W2lkeF0uZW51bV92YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBwX2VudW1fYXJyYXktPmVudW1fYXJyYXlbaWR4XS5lbnVtX3N0cjsKKyAgICB9CisgICAgcmV0dXJuIGdfdW5rbm93bl9zdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXV0aWxzX2lzX2Zyd2RfYnJvYWRjYXN0X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOkNoZWNrIHdoZXRoZXIgcGFja2V0IGlzIGRpcmVjdGx5IGZvcndhcmRlZCBicm9hZGNhc3Qgb25lCisqCisqIElOUFVUUzoKKyogICAgICAgZGF0YSAgIC0gcGFja2V0IGRhdGEKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBUUlVFOiBicm9hZGNhc3QgcGFja2V0LCBGQUxTRTpub25lIGJyb2FkY2FzdCBwYWNrZXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIG11dGlsc19pc19mcndkX2Jyb2FkY2FzdF9wYWNrZXQoY2hhciAqZGF0YSkKK3sKKyAgICBjaGFyIGJjX21hY1s2XSA9IHsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGfTsKKyAgICBjaGFyICpwX2RhdGE7CisKKyAgICBwX2RhdGEgPSBkYXRhICsgTVZfRVRIX01IX1NJWkU7CisKKyAgICBpZiAoIW1lbWNtcChwX2RhdGEsICZiY19tYWNbMF0sIHNpemVvZihiY19tYWMpKSkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9pbmZyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzOGQxYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfaW5mcmEuaApAQCAtMCwwICsxLDQyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9pbmZyYS5oCisqCisqIERFU0NSSVBUSU9OOiBJbmNsdWRlIHVzZXIgc3BhY2UgaW5mcmFzdHJ1Y3R1cmUgbW9kdWxlcyBkZWZpbml0aW9ucworKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjAKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9NVl9DUEhfSU5GUkFfSF8KKyNkZWZpbmUgX01WX0NQSF9JTkZSQV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGF0YSBUeXBlIERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgICBJTlQ4OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgVUlOVDg7Cit0eXBlZGVmICAgICAgICAgIHNob3J0ICAgICBJTlQxNjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgIFVJTlQxNjsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICAgIElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgVUlOVDMyOwordHlwZWRlZiAgICAgICAgICBsb25nIGxvbmcgSU5UNjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSU5UNjQ7Cit0eXBlZGVmICAgICAgICAgIGNoYXIgICAgICBDSEFSOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgVUNIQVI7Cit0eXBlZGVmICAgICAgICAgIGxvbmcgICAgICBMT05HOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgVUxPTkc7CisKK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICAgIFZPSUQ7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgICBTVEFUVVM7CisKK3R5cGVkZWYgYm9vbCAgICAgICAgICAgICAgIEJPT0w7CisjZGVmaW5lIFRSVUUgICAgICAgICAgICAgICB0cnVlCisjZGVmaW5lIEZBTFNFICAgICAgICAgICAgICBmYWxzZQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBvcnQgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEV0aGVybmV0IHBvcnQgaW5kZXggKi8KKyNkZWZpbmUgTVZfQVBQX0VUSF9QT1JUX0lOREVYX01JTiAxCisjZGVmaW5lIE1WX0FQUF9FVEhfUE9SVF9JTkRFWF9NQVggNAorI2RlZmluZSBNVl9BUFBfRVRIX1BPUlRfTlVNICAgICAgIChNVl9BUFBfRVRIX1BPUlRfSU5ERVhfTUFYLU1WX0FQUF9FVEhfUE9SVF9JTkRFWF9NSU4rMSkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzAgICA9IDEsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV8xLAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfMiwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzMsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV80LAorICAgIE1WX0FQUF9FVEhfUE9SVF9VTklfNSwKKyAgICBNVl9BUFBfRVRIX1BPUlRfVU5JXzYsCisgICAgTVZfQVBQX0VUSF9QT1JUX1VOSV83LAorICAgIE1WX0FQUF9FVEhfUE9SVF9JTlZBTElEICAgCit9ICBNVl9BUFBfRVRIX1BPUlRfVU5JX0U7CisKKy8qIFZvSVAgcG9ydCBpbmRleCAqLworI2RlZmluZSBNVl9BUFBfVk9JUF9QT1JUX0lOREVYX01JTiAxCisjZGVmaW5lIE1WX0FQUF9WT0lQX1BPUlRfSU5ERVhfTUFYIDIKKyNkZWZpbmUgTVZfQVBQX1ZPSVBfUE9SVF9OVU0gICAgICAgKE1WX0FQUF9WT0lQX1BPUlRfSU5ERVhfTUFYLU1WX0FQUF9WT0lQX1BPUlRfSU5ERVhfTUlOKzEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX1ZPSVBfUE9SVF8wID0gMSwKKyAgICBNVl9BUFBfVk9JUF9QT1JUXzEKK30gIE1WX0FQUF9WT0lQX1BPUlRfRTsKKworLyogV0lGSSBTU0lEIHBvcnQgaW5kZXggKi8KKyNkZWZpbmUgTVZfQVBQX1NTSURfSU5ERVhfTUlOIDEKKyNkZWZpbmUgTVZfQVBQX1NTSURfSU5ERVhfTUFYIDQKK3R5cGVkZWYgZW51bSB7CisgICAgTVZfQVBQX1NTSURfMCA9IDEsCisgICAgTVZfQVBQX1NTSURfMSwKKyAgICBNVl9BUFBfU1NJRF8yLAorICAgIE1WX0FQUF9TU0lEXzMsCisgICAgTVZfQVBQX1NTSURfNCwKKyAgICBNVl9BUFBfU1NJRF81LAorICAgIE1WX0FQUF9TU0lEXzYsCisgICAgTVZfQVBQX1NTSURfNworfSAgTVZfQVBQX1NTSURfRTsKKworLyogVVNCIHBvcnQgaW5kZXggKi8KKyNkZWZpbmUgTVZfQVBQX1VTQl9QT1JUX0lOREVYX01JTiAxCisjZGVmaW5lIE1WX0FQUF9VU0JfUE9SVF9JTkRFWF9NQVggMgorI2RlZmluZSBNVl9BUFBfVVNCX1BPUlRfTlVNICAgICAgIChNVl9BUFBfVVNCX1BPUlRfSU5ERVhfTUFYLU1WX0FQUF9VU0JfUE9SVF9JTkRFWF9NSU4rMSkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfVVNCX1BPUlRfMCA9IDEsCisgICAgTVZfQVBQX1VTQl9QT1JUXzEKK30gIE1WX0FQUF9VU0JfUE9SVF9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHRSBNQUMgUG9ydCBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9BUFBfR01BQ19QT1JUXzAgICAgICAgPSAwLAorICAgIE1WX0FQUF9HTUFDX1BPUlRfMSwKKyAgICBNVl9BUFBfUE9OX01BQ19QT1JULAorICAgIE1WX0FQUF9HTUFDX1BPUlRfTlVNICAgICA9IDMsCisgICAgTVZfQVBQX0dNQUNfUE9SVF9JTlZBTElEID0gMywKK30gIE1WX0FQUF9HTUFDX1BPUlRfRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVC1DT05UL0xMSUQgSW5kZXggRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTVZfVENPTlRfTExJRF9NSU4gMAorI2RlZmluZSBNVl9UQ09OVF9MTElEX01BWCA3CisjZGVmaW5lIE1WX1RDT05UX0xMSURfTlVNIChNVl9UQ09OVF9MTElEX01BWC1NVl9UQ09OVF9MTElEX01JTisxKQorCit0eXBlZGVmIGVudW0geworICAgIE1WX1RDT05UX0xMSURfMCA9IDAsCisgICAgTVZfVENPTlRfTExJRF8xLAorICAgIE1WX1RDT05UX0xMSURfMiwKKyAgICBNVl9UQ09OVF9MTElEXzMsCisgICAgTVZfVENPTlRfTExJRF80LAorICAgIE1WX1RDT05UX0xMSURfNSwKKyAgICBNVl9UQ09OVF9MTElEXzYgLAorICAgIE1WX1RDT05UX0xMSURfNywgCisgICAgTVZfVENPTlRfTExJRF84LAorICAgIE1WX1RDT05UX0xMSURfOSwKKyAgICBNVl9UQ09OVF9MTElEXzEwLAorICAgIE1WX1RDT05UX0xMSURfMTEsCisgICAgTVZfVENPTlRfTExJRF8xMiwKKyAgICBNVl9UQ09OVF9MTElEXzEzLAorICAgIE1WX1RDT05UX0xMSURfMTQgLAorICAgIE1WX1RDT05UX0xMSURfMTUsIAorICAgIE1WX1RDT05UX0xMSURfQlJPQURDQVNULAorICAgIE1WX1RDT05UX0xMSURfSU5WQUxJRAorfSBNVl9UQ09OVF9MTElEX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdBTiBhbmQgTEFOIEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIE1WX0FQUF9QT1JUX1dBTiA9IDAsCisgICAgTVZfQVBQX1BPUlRfTEFOLAorICAgIE1WX0FQUF9QT1JUX0lOVkFMSUQsCit9ICBNVl9BUFBfUE9SVF9UWVBFX0U7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdFTSBQb3J0IEluZGV4IERlZmluaXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE1WX0dFTV9QT1JUX01JTiAgMAorI2RlZmluZSBNVl9HRU1fUE9SVF9NQVggIDQwOTUKKyNkZWZpbmUgTVZfR0VNX1BPUlRfTlVNICAoTVZfR0VNX1BPUlRfTUFYLU1WX0dFTV9QT1JUX01JTisxKQorI2RlZmluZSBNVl9HRU1fUE9SVF9NQVNLIDB4MEZGRgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBRdWV1ZSBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNVl9RVUVVRV9NSU4gIDAKKyNkZWZpbmUgTVZfUVVFVUVfTUFYICA3CisjZGVmaW5lIE1WX1FVRVVFX05VTSAgKE1WX1FVRVVFX01BWC1NVl9RVUVVRV9NSU4rMSkKKyNkZWZpbmUgTVZfSU5WQUxJRF9RVUVVRV9OVU0gICgweEZGKSAvKiBJbnZhbGlkIHF1ZXVlIG51bWJlciAgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVl9RVUVVRV8wID0gMCwKKyAgICBNVl9RVUVVRV8xLAorICAgIE1WX1FVRVVFXzIsCisgICAgTVZfUVVFVUVfMywKKyAgICBNVl9RVUVVRV80LAorICAgIE1WX1FVRVVFXzUsCisgICAgTVZfUVVFVUVfNiwKKyAgICBNVl9RVUVVRV83Cit9ICBNVl9RVUVVRV9FOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWTEFOIElEL1AtYml0cyBJbmRleCBEZWZpbml0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNVl9WTEFOX0lEX01JTiAgMAorI2RlZmluZSBNVl9WTEFOX0lEX01BWCA0MDk1CisjZGVmaW5lIE1WX1ZMQU5fSURfTlVNIChNVl9WTEFOX0lEX01BWC1NVl9WTEFOX0lEX01JTisxKQorI2RlZmluZSBNVl9WTEFOX0lEX01BU0sgMHgwRkZGCisjZGVmaW5lIE1WX1ZMQU5fSURfSU5WQUxJRF9WQUxVRSAweEZGRkYKKworI2RlZmluZSBNVl9QQklUU19NSU4gICAwCisjZGVmaW5lIE1WX1BCSVRTX01BWCAgIDcKKyNkZWZpbmUgTVZfUEJJVFNfTlVNICAoTVZfUEJJVFNfTUFYLU1WX1BCSVRTX01JTisxKQorI2RlZmluZSBNVl9QQklUU19TSElGVCAxMworI2RlZmluZSBNVl9QQklUU19NQVNLIDB4MDcKKyNkZWZpbmUgTVZfUEJJVFNfSU5WQUxJRF9WQUxVRSAweEZGCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV0FOIFBvcnQgU3RhdGUgRGVmaW5pdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTVZfR0VfUE9SVF9JTkFDVElWRSA9IDAsCisgICAgTVZfR0VfUE9SVF9BQ1RJVkUsCisgICAgTVZfR0VfUE9SVF9JTlZBTElELAorfSAgTVZfR0VfUE9SVF9TVEFURV9FOworCisvKiBFbnVtIGZvciB3ZWxsIGtub3duIFRQSUQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIE1WX1RQSURfODEwMCAweDgxMDAKKyNkZWZpbmUgTVZfVFBJRF84OEE4IDB4ODhBOAorI2RlZmluZSBNVl9UUElEXzkxMDAgMHg5MTAwCisjZGVmaW5lIE1WX0NQSF9UUElEX0xFTiAgICAgICgyKQorI2RlZmluZSBNVl9DUEhfVkxBTl9UQUdfTEVOICAoMikKKyNkZWZpbmUgTVZfQ1BIX0VUSF9UWVBFX0xFTiAgKDIpCisjZGVmaW5lIE1WX0lQVjRfUFJPVE9fT0ZGU0VUICg5KQorI2RlZmluZSBNVl9JQ01QVjZfVFlQRV9NTEQgICAoMSkKKyNkZWZpbmUgTVZfQ1BIX0VUSF9UWVBFX0lQVjQgKDB4MDgwMCkKKyNkZWZpbmUgTVZfQ1BIX0VUSF9UWVBFX0lQVjYgKDB4ODZERCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBUUE0gU291cmNlIHBvcnQgLSB1c2VkIHRvIHNwZWNpZnkgdGhyb3VnaCB3aGljaCBwb3J0IHRoZSBwYWNrZXQgZW50ZXJlZCB0aGUgcHJvY2Vzc29yCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBlbnVtIHsKKyAgICBUUE1fU1JDX1BPUlRfVU5JXzAsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfMSwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV8yLCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzMsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfNCwgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV81LCAgICAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JXzYsICAgICAgICAvKiB1cHN0cmVhbSAqLworICAgIFRQTV9TUkNfUE9SVF9VTklfNywgICAgICAgIC8qIHVwc3RyZWFtICovCisgICAgVFBNX1NSQ19QT1JUX1VOSV9WSVJULCAgICAgLyogdXBzdHJlYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfV0FOLCAgICAgICAgICAvKiBkb3duc3RyYW0gKi8KKyAgICBUUE1fU1JDX1BPUlRfVU5JX0FOWSwgICAgICAvKiB1cHN0cmVhbSAtIGFsbCBVTkkgcG9ydHMgKi8KKyAgICBUUE1fU1JDX1BPUlRfV0FOX09SX0xBTiwgICAvKiBBbnkgUG9ydCwgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBUUE1fU1JDX1BPUlRfSUxMRUdBTCA9IDB4RkYKK30gdHBtX3NyY19wb3J0X3R5cGVfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ2hlY2sgQVBJIHJldHVybiB2YWx1ZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQ0hFQ0tfQVBJX1JFVFVSTl9BTkRfTE9HX0VSUk9SKHJldCwgbG9nKSBcCit7XAorICAgIElOVDMyIHJjID0gMCA7XAorICAgIGlmKChyYyA9IChyZXQpKSAhPSAwKVwKKyAgICB7XAorICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzKCVkKSBlcnJvcjolcyAsIHJldCglZClcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIChsb2cpLCByYyk7XAorICAgICAgICByZXR1cm4gKHJjKSA7XAorICAgIH1cCit9CisKKyNkZWZpbmUgQ1BIX1RCTF9FTlRSWV9OVU0oYSkgKHNpemVvZihhKS9zaXplb2YoYVswXSkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVudW0gZm9yIGRpc3BsYXkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDMyICBlbnVtX3ZhbHVlOworICAgIENIQVIgICplbnVtX3N0cjsKK30gTVZfRU5VTV9FTlRSWV9UOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIElOVDMyICAgICAgICAgICAgZW51bV9udW07CisgICAgTVZfRU5VTV9FTlRSWV9UICplbnVtX2FycmF5OworfSBNVl9FTlVNX0FSUkFZX1Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uIERlY2xhcmF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtaW5kZXhfdHBtX3NyY190b19hcHBfcG9ydCgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgVFBNIHNvdXJjZSBwb3J0IHRvIGFwcGxpY2F0aW9uIFVOSSBwb3J0IAorKgorKiBJTlBVVFM6CisqICAgICAgIHNyY19wb3J0ICAgIC0gVFBNIHNvdXJjZSBwb3J0CisqCisqIE9VVFBVVFM6CisqICAgICAgIEFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4CisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFwcGxpY2F0aW9uIFVOSSBwb3J0IGluZGV4LiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJuIGludmFsaWQgYXBwbGljYXRpb24gVU5JIHBvcnQgaW5kZXguCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQVBQX0VUSF9QT1JUX1VOSV9FIG1pbmRleF90cG1fc3JjX3RvX2FwcF9wb3J0KHRwbV9zcmNfcG9ydF90eXBlX3Qgc3JjX3BvcnQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG1pbmRleF9taF90b19hcHBfbGxpZCgpCisqCisqIERFU0NSSVBUSU9OOkNvbnZlcnQgTWFydmVsbCBoZWFkZXIgdG8gYXBwbGljYXRpb24gTExJRCAKKyoKKyogSU5QVVRTOgorKiAgICAgICBtaCAgLSBNYXJ2ZWxsIGhlYWRlcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBBcHBsaWNhdGlvbiBMTElECisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFwcGxpY2F0aW9uIExMSUQuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm4gaW52YWxpZCBhcHBsaWNhdGlvbiBMTElELgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1RDT05UX0xMSURfRSBtaW5kZXhfbWhfdG9fYXBwX2xsaWQoVUlOVDE2IG1oKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdHlwZV9nZXRfZGlnaXRfbnVtKCkKKyoKKyogREVTQ1JJUFRJT046Q29udmVydCBjaGFyYWN0ZXIgc3RyaW5nIHRvIGRpZ2l0YWwgbnVtYmVyIAorKgorKiBJTlBVVFM6CisqICAgICAgIHN0ciAgIC0gQ2hhcmFjdGVyIHN0cmluZworKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTlM6CisqICAgICAgIERpZ2l0YWwgbnVtYmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitVSU5UMzIgbXR5cGVfZ2V0X2RpZ2l0X251bShjb25zdCBDSEFSICAqc3RyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdHlwZV9sb29rdXBfZW51bV9zdHIoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjpsb29rdXAgZW51bSBzdHJpbmcgYWNjb3JkaW5nIHRvIGVudW0gdmFsdWUKKyoKKyogSU5QVVRTOgorKiAgICAgICBwX2VudW1fYXJyYXkgICAtIFBvaW50ZXIgdG8gZW51bSBhcnJheQorKiAgICAgICBlbnVtX3ZhbHVlICAgICAtIFRoZSBlbnVtIHZhbHVlIHRvIGJlIG1hdGNoZWQKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBFbnVtIHN0cmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0NIQVIgKm10eXBlX2xvb2t1cF9lbnVtX3N0cihNVl9FTlVNX0FSUkFZX1QgKnBfZW51bV9hcnJheSwgSU5UMzIgZW51bV92YWx1ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXV0aWxzX2lzX2Zyd2RfYnJvYWRjYXN0X3BhY2tldCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOkNoZWNrIHdoZXRoZXIgcGFja2V0IGlzIGRpcmVjdGx5IGZvcndhcmRlZCBicm9hZGNhc3Qgb25lCisqCisqIElOUFVUUzoKKyogICAgICAgZGF0YSAgIC0gcGFja2V0IGRhdGEKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZQorKgorKiBSRVRVUk5TOgorKiAgICAgICBUUlVFOiBicm9hZGNhc3QgcGFja2V0LCBGQUxTRTpub25lIGJyb2FkY2FzdCBwYWNrZXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitCT09MIG11dGlsc19pc19mcndkX2Jyb2FkY2FzdF9wYWNrZXQoY2hhciAqZGF0YSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9JTkZSQV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21uZ19pZi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21uZ19pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJjZmJkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW5nX2lmLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfbW5nX2lmLmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgbWFuYWdlbWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbgorKiAgICAgICAgICAgICAgZm9yIGlvY3RsCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAxMURlYzIwMTEKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9NTkdfSUZfSF8KKyNkZWZpbmUgX01WX0NQSF9NTkdfSUZfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEluY2x1ZGUgRmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorCisvKiBEZWZpbml0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX1NFVF9DT01QTEVYX1BST0ZJTEUgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDEsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9TRVRfRkVBVFVSRV9GTEFHICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAyLCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfQVBQX0FERF9SVUxFICAgICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMywgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0FQUF9ERUxfUlVMRSAgICAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDQsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9BUFBfVVBEQVRFX1JVTEUgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICA1LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfQVBQX0dFVF9SVUxFICAgICAgICAgICAgIF9JT1IoTVZfQ1BIX0lPQ1RMX01BR0lDLCAgNiwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfQUREX1JVTEUgICAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDcsICBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0RFTF9SVUxFICAgICAgICAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICA4LCAgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19HRVRfUlVMRSAgICAgICAgICAgIF9JT1IoTVZfQ1BIX0lPQ1RMX01BR0lDLCAgOSwgIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfQ0xFQVJfUlVMRSAgICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDEwLCBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9GTE9XX0NMRUFSX1JVTEVfQllfTUggICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxMSwgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfRkxPV19TRVRfRFNDUF9NQVAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTIsIFVJTlQzMikKKyNkZWZpbmUgTVZfQ1BIX0lPQ1RMX0ZMT1dfREVMX0RTQ1BfTUFQICAgICAgICBfSU9XKE1WX0NQSF9JT0NUTF9NQUdJQywgIDEzLCBVSU5UMzIpCisjZGVmaW5lIE1WX0NQSF9JT0NUTF9TRVRfVENPTlRfTExJRF9TVEFURSAgICAgX0lPVyhNVl9DUEhfSU9DVExfTUFHSUMsICAxNCwgVUlOVDMyKQorI2RlZmluZSBNVl9DUEhfSU9DVExfU0VUVVAgICAgICAgICAgICAgICAgICAgIF9JT1coTVZfQ1BIX0lPQ1RMX01BR0lDLCAgMTUsIFVJTlQzMikKKworLyogVHlwZWRlZnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIHN0cnVjdAoreworICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibTsgCisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsgIAorICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm07IAorICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7IAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtOyAKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKKworfSBDUEhfSU9DVExfQVBQX1JVTEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfRkxPV19FTlRSWV9UIGZsb3dfbWFwOworfSBDUEhfSU9DVExfRkxPV19NQVBfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDUEhfRFNDUF9QQklUU19UIGRzY3BfbWFwOworfSBDUEhfSU9DVExfRFNDUF9NQVBfVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB0cG1fZXRoX2NvbXBsZXhfcHJvZmlsZV90IHByb2ZpbGVfaWQ7CisgICAgTVZfQVBQX0dNQUNfUE9SVF9FICAgICAgICBhY3RpdmVfcG9ydDsKKyAgICBDUEhfQVBQX0ZFQVRVUkVfRSAgICAgICAgIGZlYXR1cmVfdHlwZTsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfZmxhZzsgCit9IENQSF9JT0NUTF9NSVNDX1Q7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyICB0Y29udDsKKyAgICBCT09MICAgIHN0YXRlOworfSBDUEhfSU9DVExfVENPTlRfU1RBVEVfVDsKKworLyogTVYgQ1BIIENoYXIgRGV2aWNlIFN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgQ1BIX0lPQ1RMX0FQUF9SVUxFX1QgICAgY3BoX2lvY3RsX2FwcF9ydWxlOworICBDUEhfSU9DVExfRkxPV19NQVBfVCAgICBjcGhfaW9jdGxfZmxvd19tYXA7CisgIENQSF9JT0NUTF9EU0NQX01BUF9UICAgIGNwaF9pb2N0bF9kc2NwX21hcDsKKyAgQ1BIX0lPQ1RMX01JU0NfVCAgICAgICAgY3BoX2lvY3RsX21pc2M7CisgIENQSF9JT0NUTF9UQ09OVF9TVEFURV9UIGNwaF9pb2N0bF90Y29udDsKKworICBzdHJ1Y3QgY2RldiAgICAgICAgICAgICBjZGV2OyAgCit9IENQSF9DREVWX1Q7CisKKy8qIEdsb2JhbCB2YXJpYWJsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdsb2JhbCBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX01OR19JRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21vZC5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdjNjMxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbW9kLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfbW9kLmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgbW9kdWxlIGRlZmluaXRpb24gCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAyMkphbjIwMTMKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCisjZGVmaW5lIENQSF9NT0RVTEVfVkVSU0lPTiAgIjIyLUphbi0yMDEzIgorI2RlZmluZSBDUEhfTU9EVUxFX0RFU0MgICAgICJNYXJ2ZWxsIENQVSBQYWNrZXQgSGFuZGxlciBNb2R1bGUiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX21vZF9leGl0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEV4aXQgZnJvbSBDUEggbW9kdWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFZPSUQgX19leGl0IGNwaF9tb2RfZXhpdChWT0lEKQoreworICAgIGNwaF9kZXZfc2h1dGRvd24oKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfbW9kX2luaXQoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBDUEggbW9kdWxlIAorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBfX2luaXQgY3BoX21vZF9pbml0KFZPSUQpCit7CisgICAgaWYgKGNwaF9kZXZfaW5pdCgpICE9IDApCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuQ1BIIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQgXG5cbiIpOworICAgICAgICByZXR1cm4gTVZfRVJST1I7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5DUEggbW9kdWxlIGluc2VydGVkIC0gJXNcblxuIiwgQ1BIX01PRFVMRV9WRVJTSU9OKTsKKworICAgIHJldHVybiBNVl9PSzsKK30KKworZGV2aWNlX2luaXRjYWxsX3N5bmMoY3BoX21vZF9pbml0KTsKKworbW9kdWxlX2V4aXQoY3BoX21vZF9leGl0KTsKKworTU9EVUxFX0FVVEhPUiAoIlZpY3RvciBHdSIpOworTU9EVUxFX1ZFUlNJT04gKENQSF9NT0RVTEVfVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04gKENQSF9NT0RVTEVfREVTQyk7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlkMWU2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbmV0ZGV2LmMKQEAgLTAsMCArMSw4ODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfbmV0ZGV2LmMKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgbmV0d29yayBkZXZpY2UgcGFydCBkZWZpbml0aW9uIAorKgorKiBERVBFTkRFTkNJRVM6CisqICAgICAgICAgICAgICAgTm9uZQorKgorKiBDUkVBVEVEIEJZOiAgIFZpY3Rvckd1CisqCisqIERBVEUgQ1JFQVRFRDogMjJKYW4yMDEzCisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAgICAgICAgIFJldmlzaW9uOiAxLjEKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisKKyNpbmNsdWRlIDxjdHJsRW52L212Q3RybEVudkxpYi5oPgorCisjaW5jbHVkZSAibXZEZWJ1Zy5oIgorI2luY2x1ZGUgIm12X2NwaF9oZWFkZXIuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbCBEZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVG90YWwgRXRoIHBvcnQgbnVtYmVyICovCitzdGF0aWMgSU5UMzIgZ3NfbXZfZXRoX3BvcnRfbnVtID0gMDsKKworCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorc3RhdGljIHN0cnVjdCBtdl9wb3J0X3R4X3NwZWMgICAgdWRwX3BvcnRfc3BlY19jZmdbQ09ORklHX01WX0VUSF9QT1JUU19OVU1dOworI2RlZmluZSBQT1JUX0VOVFJJRVMgICAgICAgIENQSF9UQkxfRU5UUllfTlVNKHVkcF9wb3J0X3NwZWNfY2ZnKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgRGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gSU5UMzIgY3BoX2RhdGFfZmxvd190eChJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBtaCwgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfcmVjX3NrYigpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBTZW5kIFNLQiBwYWNrZXQgdG8gbGludXggbmV0d29yayBhbmQgaW5jcmVzZSBjb3VudGVyICAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBza2IgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK1ZPSUQgY3BoX3JlY19za2IoSU5UMzIgcG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyAgICBVSU5UMzIgcnhfc3RhdHVzICAgID0gMDsKKyAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gTlVMTDsKKworICAgIHJ4X3N0YXR1cyA9IG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisgICAgcHAgICAgICAgID0gbXZfZXRoX3BvcnRfYnlfaWQocG9ydCk7CisgICAgU1RBVF9EQkcoaWYgKHJ4X3N0YXR1cykgKHBwLT5zdGF0cy5yeF9kcm9wX3N3KyspKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhY2tldF9yeCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgLSBOZXQgZGV2aWNlCisqICAgICAgIHNrYiAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIHJ4X2Rlc2MgLSBSWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIElOVDMyIGNwaF9hcHBfcGFja2V0X3J4KElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisgICAgQ1BIX0FQUF9QQVJTRV9GSUVMRF9FIHBhcnNlX2JtID0gMDsKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgcGFyc2Vfa2V5OworICAgIElOVDMyICAgICAgICAgICAgICAgICByYyAgICAgICA9IE1WX09LOworICAgIENQSF9BUFBfTU9EX0ZJRUxEX0UgICBtb2RfYm0gICA9IDA7CisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsgCisgICAgQ1BIX0FQUF9GUldEX0ZJRUxEX0UgIGZyd2RfYm0gID0gMDsgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7CisgICAgQk9PTCAgICAgICAgICAgICAgICAgIHN0YXRlICAgID0gRkFMU0U7ICAgIAorCisgICAgLyogQ2hlY2sgd2hldGhlciBuZWVkIHRvIGhhbmRsZSBnZW5lcmljIGFwcGxpY2F0aW9uIHBhY2tldCAqLworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0FQUF9TVVBQT1JULCAmc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBGQUxTRSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1zZXQoJnBhcnNlX2tleSwgIDAsIHNpemVvZihwYXJzZV9rZXkpKTsKKyAgICBtZW1zZXQoJm1vZF92YWx1ZSwgIDAsIHNpemVvZihtb2RfdmFsdWUpKTsKKyAgICBtZW1zZXQoJmZyd2RfdmFsdWUsIDAsIHNpemVvZihmcndkX3ZhbHVlKSk7ICAgIAorCisgICAgLyogUGFyc2UgYXBwbGljYXRpb24gcGFja2V0ICovCisgICAgcmMgPSBjcGhfYXBwX3BhcnNlX3BhY2tldChwb3J0LCBza2ItPmRhdGEsICZwYXJzZV9ibSwgJnBhcnNlX2tleSk7CisgICAgaWYgKHJjICE9IE1WX09LKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbCB0byBjYWxsIGNwaF9hcHBfcGFyc2VfcGFja2V0LCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2V0IENQSCBhcHBsaWNhdGlvbiBydWxlICovCisgICAgcmMgPSBjcGhfYXBwX2dldF9ydWxlKHBhcnNlX2JtLCAmcGFyc2Vfa2V5LCAmbW9kX2JtLCAmbW9kX3ZhbHVlLCAmZnJ3ZF9ibSwgJmZyd2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiRmFpbCB0byBjYWxsIGNwaF9hcHBfZ2V0X3J1bGUsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBJbmNyZWFzZSBjb3VudGVyICovCisgICAgcmMgPSBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIocGFyc2VfYm0sICZwYXJzZV9rZXkpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2luY3JlYXNlX2NvdW50ZXIsIHJjKCVkKVxuIiwgcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBBcHBseSBtb2RpZmljYXRpb24gKi8KKyAgICByYyA9IGNwaF9hcHBfbW9kX3J4X3BhY2tldChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYywgbW9kX2JtLCAmbW9kX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9tb2RfcnhfcGFja2V0LCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIC8qIFNlbmQgdG8gTGludXggTmV0d29yayBTdGFjayAqLworICAgIGNwaF9yZWNfc2tiKHBvcnQsIHNrYik7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfYXBwX3BhY2tldF90eCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSB0cmFzbWl0aW5nIGFwcGxpY2F0aW9uIHBhY2tldHMgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2FwcF9wYWNrZXRfdHgoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIENQSF9ESVJfRSAgICAgICAgICAgICBkaXI7CisgICAgVUlOVDE2ICAgICAgICAgICAgICAgIHByb3RvX3R5cGUgPSAwOworICAgIENQSF9BUFBfUEFSU0VfRklFTERfRSBwYXJzZV9ibSAgID0gMDsKKyAgICBDUEhfQVBQX1BBUlNFX1QgICAgICAgcGFyc2Vfa2V5OyAgICAgCisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibSAgICAgPSAwOworICAgIENQSF9BUFBfTU9EX1QgICAgICAgICBtb2RfdmFsdWU7IAorICAgIENQSF9BUFBfRlJXRF9GSUVMRF9FICBmcndkX2JtICAgID0gMDsgCisgICAgQ1BIX0FQUF9GUldEX1QgICAgICAgIGZyd2RfdmFsdWU7CisgICAgSU5UMzIgICAgICAgICAgICAgICAgIHJjICAgICAgICAgPSBNVl9PSzsKKyAgICBCT09MICAgICAgICAgICAgICAgICAgc3RhdGUgICAgICA9IEZBTFNFOyAgICAKKworICAgIC8qIENoZWNrIHdoZXRoZXIgbmVlZCB0byBoYW5kbGUgZ2VuZXJpYyBhcHBsaWNhdGlvbiBwYWNrZXQgKi8KKyAgICBjcGhfZGJfZ2V0X3BhcmFtKENQSF9EQl9QQVJBTV9BUFBfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICBpZiAoc3RhdGUgPT0gRkFMU0UpCisgICAgICAgIHJldHVybiAwOworCisgICAgbWVtc2V0KCZwYXJzZV9rZXksICAwLCBzaXplb2YocGFyc2Vfa2V5KSk7CisgICAgbWVtc2V0KCZtb2RfdmFsdWUsICAwLCBzaXplb2YobW9kX3ZhbHVlKSk7CisgICAgbWVtc2V0KCZmcndkX3ZhbHVlLCAwLCBzaXplb2YoZnJ3ZF92YWx1ZSkpOyAgICAKKyAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7CisgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSAwOworCisgICAgLyogR2V0IGRpcmVjdGlvbiBvZiBwYWNrZXQgKi8KKyAgICBkaXIgPSBjcGhfYXBwX3BhcnNlX2Rpcihwb3J0LCBGQUxTRSk7CisgICAgaWYoZGlyID09IENQSF9ESVJfSU5WQUxJRCkKKyAgICB7CisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiZGlyWyVkXSBpcyBpbnZhbGlkIFxuIiwgZGlyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSAgIAorICAgIAorICAgIC8qIEdldCB0aGUgcHJvdG9jb2wgdHlwZSBhcHBsaWNhdGlvbiBwYWNrZXQgKi8KKyAgICBwcm90b190eXBlID0gc2tiLT5wcm90b2NvbDsKKworICAgIC8qIEdldCBDUEggYXBwbGljYXRpb24gcnVsZSBieSBwcm90b2NvbCB0eXBlICovCisgICAgcmMgPSBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90byhkaXIsIHByb3RvX3R5cGUsICZwYXJzZV9ibSwgJnBhcnNlX2tleSwgJm1vZF9ibSwgJm1vZF92YWx1ZSwgJmZyd2RfYm0sICZmcndkX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX2dldF9ydWxlX2J5X2Rpcl9wcm90b1xuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEluY3JlYXNlIGNvdW50ZXIgKi8KKyAgICByYyA9IGNwaF9hcHBfaW5jcmVhc2VfY291bnRlcl9ieV9kaXJfcHJvdG8oZGlyLCBwcm90b190eXBlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9pbmNyZWFzZV9jb3VudGVyX2J5X2Rpcl9wcm90bywgcmMoJWQpXG4iLCByYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFNlcGNpYWwgaGFuZGxpbmcgZm9yIElHTVAgYW5kIE1MRCAqLworICAgIGlmICgoKHBhcnNlX2JtICYgQ1BIX0FQUF9QQVJTRV9GSUVMRF9JUFY0X1RZUEUpICYmIAorICAgICAgICAocGFyc2Vfa2V5LmlwdjRfdHlwZSA9PSBNVl9JUF9QUk9UT19JR01QKSkgIHx8CisgICAgICAgICgocGFyc2VfYm0gJiBDUEhfQVBQX1BBUlNFX0ZJRUxEX0lDTVBWNl9UWVBFKSAmJiAKKyAgICAgICAgKHBhcnNlX2tleS5pY21wdjZfdHlwZSA9PSBNVl9JQ01QVjZfVFlQRV9NTEQpKSkKKyAgICB7CisgICAgICAgIGlmIChjcGhfZGF0YV9mbG93X3R4KHBvcnQsIGRldiwgc2tiLCBUUlVFLCB0eF9zcGVjX291dCkpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBBcHBseSBtb2RpZmljYXRpb24gYW5kIHNldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovCisgICAgcmMgPSBjcGhfYXBwX21vZF90eF9wYWNrZXQoc2tiLCB0eF9zcGVjX291dCwgbW9kX2JtLCAmbW9kX3ZhbHVlKTsKKyAgICBpZiAocmMgIT0gTVZfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsIHRvIGNhbGwgY3BoX2FwcF9tb2RfdHhfcGFja2V0LCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogU2V0IGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8KKyAgICByYyA9IGNwaF9hcHBfc2V0X2Zyd2Qoc2tiLCB0eF9zcGVjX291dCwgZnJ3ZF9ibSwgJmZyd2RfdmFsdWUpOworICAgIGlmIChyYyAhPSBNVl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gY2FsbCBjcGhfYXBwX3NldF9mcndkLCByYyglZClcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCitzdGF0aWMgaW5saW5lIHZvaWQgY3BoX2NvcHlfdHhfc3BlYyhzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKiB0eF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQoreworICAgIHR4X3NwZWMtPnR4cCA9IHR4cDsKKyAgICB0eF9zcGVjLT50eHEgPSB0eHE7CisgICAgdHhfc3BlYy0+aHdfY21kID0gaHdfY21kOworICAgIHR4X3NwZWMtPmZsYWdzID0gZmxhZ3M7Cit9CisKK2ludCBjcGhfdWRwX3NwZWNfcHJpbnQoaW50IHBvcnQpCit7CisgICAgSU5UMzIgaTsKKyAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQocG9ydCk7CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcGVjOworCisgICAgaWYgKCFwcCkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICB1ZHBfc3BlYyA9ICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7CisKKyAgICBwcmludGsoIlxuKioqKiBwb3J0ICMlZCAtIFRYIFVEUCBEZXN0IFBvcnQgY29uZmlndXJhdGlvbiAqKioqKlxuIiwgcG9ydCk7CisgICAgcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGsoIklEIHVkcF9kc3QgICB0eHAgICAgdHhxICAgIGZsYWdzICAgIGh3X2NtZCAgICAgZnVuY19hZGRcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbMF0pOyBpKyspIHsKKyAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkKKyAgICAgICAgICAgIHByaW50aygiJTJkICAgJTA0ZCAgICAgICVkICAgICAgJWQgICAgIDB4JTA0eCAgIDB4JTA4eCAgIDB4JXBcbiIsCisgICAgICAgICAgICAgICAgICAgaSwgbnRvaHModWRwX3NwZWNbaV0udWRwX3BvcnQpLAorICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhwLCB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLmZsYWdzLCB1ZHBfc3BlY1tpXS50eF9zcGVjLmh3X2NtZCwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4X2Z1bmMpOworICAgIH0KKyAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworICAgIHVkcF9zcGVjID0gJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTsKKworICAgIHByaW50aygiKioqKiBwb3J0ICMlZCAtIFRYIFVEUCBTb3VyY2UgUG9ydCBjb25maWd1cmF0aW9uICoqKioqXG4iLCBwb3J0KTsKKyAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBwcmludGsoIklEIHVkcF9zcmMgICB0eHAgICAgdHhxICAgICBmbGFncyAgICBod19jbWQgICAgIGZ1bmNfYWRkXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTsgaSsrKSB7CisgICAgICAgIGlmICh1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpCisgICAgICAgICAgICBwcmludGsoIiUyZCAgICUwNGQgICAgICAlZCAgICAgICVkICAgICAweCUwNHggICAweCUwOHggICAweCVwXG4iLAorICAgICAgICAgICAgICAgICAgIGksIG50b2hzKHVkcF9zcGVjW2ldLnVkcF9wb3J0KSwKKyAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cCwgdWRwX3NwZWNbaV0udHhfc3BlYy50eHEsCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy5mbGFncywgdWRwX3NwZWNbaV0udHhfc3BlYy5od19jbWQsCisgICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eF9mdW5jKTsKKyAgICB9CisgICAgcHJpbnRrKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGNwaF91ZHBfc3BlY19wcmludF9hbGwodm9pZCkKK3sKKyAgICBJTlQzMiBwb3J0OworCisgICAgZm9yIChwb3J0PTA7cG9ydCA8IENPTkZJR19NVl9FVEhfUE9SVFNfTlVNIDtwb3J0KyspIHsKKyAgICAgICAgY3BoX3VkcF9zcGVjX3ByaW50KHBvcnQpOworICAgIH0KK30KKworTVZfU1RBVFVTICBjcGhfdWRwX2ludF9zcGVjX3NldChzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWMsIHVpbnQxNl90IHVkcF9wb3J0LCBJTlQzMiB0YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQoreworICAgIElOVDMyIGk7CisKKyAgICAvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0cyAqLworICAgIGZvciAoaT0wOyBpIDwgdGFibGVfc2l6ZTtpKyspIHsKKyAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnVkcF9wb3J0ID09IGh0b25zKHVkcF9wb3J0KSAmJgorICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKSB7CisgICAgICAgICAgICBjcGhfY29weV90eF9zcGVjKCYodWRwX3NwZWNbaV0udHhfc3BlYyksIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKKyAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayBlbXB0eSAqLworICAgIGZvciAoaT0wOyBpIDwgdGFibGVfc2l6ZTtpKyspIHsKKyAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxID09IE1WX0VUSF9UWFFfSU5WQUxJRCkgeworICAgICAgICAgICAgdWRwX3NwZWNbaV0udWRwX3BvcnQgPSBodG9ucyh1ZHBfcG9ydCk7CisgICAgICAgICAgICBjcGhfY29weV90eF9zcGVjKCYodWRwX3NwZWNbaV0udHhfc3BlYyksIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKKyAgICAgICAgICAgIHJldHVybiBNVl9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihNVl9GVUxMKTsKK30KKworCitNVl9TVEFUVVMgIGNwaF91ZHBfc3JjX3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfc3JjX3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKK3sKKyAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQodHhfcG9ydCk7CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9zcmNfc3BlYyA9IHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmM7CisgICAgTVZfU1RBVFVTIG12X3N0YXR1czsKKworICAgIGlmICghcHApCisgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgbXZfc3RhdHVzID0gY3BoX3VkcF9pbnRfc3BlY19zZXQodWRwX3NyY19zcGVjLCB1ZHBfc3JjX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKKworICAgIGlmIChtdl9zdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHByaW50aygiJXM6IFVEUCBTcGVjaWFsIFNvdXJjZSBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKKworICAgIHJldHVybihtdl9zdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTChjcGhfdWRwX3NyY19zcGVjX3NldCk7CisKKworTVZfU1RBVFVTICBjcGhfdWRwX2Rlc3Rfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9kZXN0X3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKK3sKKyAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwID0gbXZfZXRoX3BvcnRfYnlfaWQodHhfcG9ydCk7CisgICAgc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgKnVkcF9kc3Rfc3BlYyA9IHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3Q7CisgICAgTVZfU1RBVFVTIG12X3N0YXR1czsKKworICAgIGlmICghcHApCisgICAgICAgIHJldHVybiAtRU5PREVWOworCisgICAgbXZfc3RhdHVzID0gY3BoX3VkcF9pbnRfc3BlY19zZXQodWRwX2RzdF9zcGVjLCB1ZHBfZGVzdF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7CisKKyAgICBpZiAobXZfc3RhdHVzICE9IE1WX09LKQorICAgICAgICBwcmludGsoIiVzOiBVRFAgU3BlY2lhbCBEZXN0LiBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKKworICAgIHJldHVybihtdl9zdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTChjcGhfdWRwX2Rlc3Rfc3BlY19zZXQpOworCisKK3ZvaWQgIGNwaF91ZHBfdGFibGVfaW5pdCh2b2lkKQoreworICAgIElOVDMyIG51bV9wb3J0cyA9IFBPUlRfRU5UUklFUzsKKyAgICBJTlQzMiB0eF9wb3J0LCBpOworCisgICAgaWYgKG51bV9wb3J0cyA+IGdzX212X2V0aF9wb3J0X251bSkKKyAgICAgICAgbnVtX3BvcnRzID0gZ3NfbXZfZXRoX3BvcnRfbnVtOworCisKKyAgICBmb3IgKHR4X3BvcnQ9MDsgdHhfcG9ydDxudW1fcG9ydHM7dHhfcG9ydCsrKSB7CisKKyAgICAgICAgLyogSW52YWxpZGF0ZSBVRFAgRGVzdCBwb3J0cywgc2V0IHR4cT1pbnZhbGlkICAqLworICAgICAgICBmb3IgKGk9MDtpPChzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbMF0pKTtpKyspIHsKKyAgICAgICAgICAgIG1lbXNldCgmKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbaV0pLCAwLCBzaXplb2Yoc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMpKTsKKyAgICAgICAgICAgIHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbaV0udHhfc3BlYy50eHEgPSBNVl9FVEhfVFhRX0lOVkFMSUQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnZhbGlkYXRlIFVEUCBTb3VyY2UgcG9ydHMsICwgc2V0IHR4cT1pbnZhbGlkICovCisgICAgICAgIGZvciAoaT0wO2k8KHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1swXSkpO2krKykgeworICAgICAgICAgICAgbWVtc2V0KCYodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1tpXSksIDAsIHNpemVvZihzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYykpOworICAgICAgICAgICAgdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSA9IE1WX0VUSF9UWFFfSU5WQUxJRDsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybjsKK30KKworaW50IGNwaF91ZHBfcG9ydF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCit7CisgICAgc3RydWN0IGlwaGRyICAqaXBoZHJwICAgPSBOVUxMOworICAgIHN0cnVjdCB1ZHBoZHIgKnVkcGhkcnAgID0gTlVMTDsKKyAgICBJTlQzMiBpOworCisgICAgaWYgKHBvcnQgPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkgeworICAgICAgICBwcmludGsoIlBvcnQgRXJyb3JcbiIpOworICAgICAgICByZXR1cm4oMCk7CisgICAgfQorCisgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gTVZfQ1BIX0VUSF9UWVBFX0lQVjQpIHsKKyAgICAgICAgLyogR2V0IFVEUCBQb3J0ICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQorICAgIGlwaGRycCA9IHNrYi0+bmguaXBoOworI2Vsc2UKKyAgICBpcGhkcnAgPSBpcF9oZHIoc2tiKTsKKyNlbmRpZgorCisgICAgICAgIGlmICgoaXBoZHJwKSAmJiAoaXBoZHJwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpCisgICAgICAgIHVkcGhkcnAgPSBza2ItPmgudWg7CisjZWxzZQorICAgICAgICB1ZHBoZHJwID0gdWRwX2hkcihza2IpOworI2VuZGlmCisgICAgICAgICAgICBpZiAodWRwaGRycCkgeworICAgICAgICAgICAgICAgIGlmICh1ZHBoZHJwID09IChzdHJ1Y3QgdWRwaGRyICopaXBoZHJwKSB7CisgICAgICAgICAgICAgICAgICAgIHVkcGhkcnAgPSAoc3RydWN0IHVkcGhkciAqKSgoY2hhciAqKXVkcGhkcnAgKyAoNCooaXBoZHJwLT5paGwpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEZpbmQgY29uZmlndXJlZCBVRFAgU291cmNlIFBvcnQqLworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTtpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5zb3VyY2UgPT0gdWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS51ZHBfcG9ydCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjKSwgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOworICAgICAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgImZvdW5kIHVkcF9zcmMgMHgoJTA0eClcbiIsIG50b2hzKHVkcGhkcnAtPnNvdXJjZSkpOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRmluZCBjb25maWd1cmVkIFVEUCBEZXN0LiBQb3J0Ki8KKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWRwaGRycC0+ZGVzdCA9PSB1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0W2ldLnVkcF9wb3J0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5ICh0eF9zcGVjX291dCwgJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0W2ldLnR4X3NwZWMpLCBzaXplb2Yoc3RydWN0IG12X2V0aF90eF9zcGVjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiZm91bmQgdWRwX2RzdCAweCglMDR4KVxuIiwgbnRvaHModWRwaGRycC0+ZGVzdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocG9ydCA9PSBNVl9QT05fUE9SVF9JRCkgeworICAgICAgICAgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiUGFja2V0IFVEUCwgdWRwIHNvdXJjZSBvciBkZXN0IHBvcnQgbm90IGZvdW5kIHVkcF9zcmMoJXgpeCB1ZHBfZHN0KCV4KXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyh1ZHBoZHJwLT5zb3VyY2UpLCBudG9ocyh1ZHBoZHJwLT5kZXN0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQgKQorICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIk5PVCBVRFAsIGlwX3Byb3RvKCVkKSBcbiIsIGlwaGRycC0+cHJvdG9jb2wpOworICAgIH0KKyAgICBlbHNlIGlmIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKQorICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0RFQlVHX0xFVkVMLCAiTk9UIElQLCBwcm90byglZCkgXG4iLCBza2ItPnByb3RvY29sKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYXRhX2Zsb3dfcngoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgcmVjZWl2ZWQgYXBwbGljYXRpb24gcGFja2V0cyAKKyoKKyogSU5QVVRTOgorKiAgICAgICBwb3J0ICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgIC0gU0tCIGJ1ZmZlciB0byByZWNlaXZlIHBhY2tldAorKiAgICAgICByeF9kZXNjIC0gUlggZGVzY3JpcHRvcgorKgorKiBPVVRQVVRTOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk5TOgorKiAgICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAxLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyAwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBJTlQzMiBjcGhfZGF0YV9mbG93X3J4KElOVDMyIHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCit7CisgICAgQ1BIX0ZMT1dfRU5UUllfVCBmbG93X3J1bGU7CisgICAgSU5UMzIgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgIEJPT0wgICAgICAgICAgICAgc3RhdGUgID0gRkFMU0U7CisgICAgTVZfU1RBVFVTICAgICAgICByYyAgICAgPSBNVl9PSzsKKworICAgIGlmIChNVl9QT05fUE9SVF9JRCAhPSBwb3J0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNwaF9kYl9nZXRfcGFyYW0oQ1BIX0RCX1BBUkFNX0ZMT1dfU1VQUE9SVCwgJnN0YXRlKTsKKyAgICAKKyAgICBpZiAoc3RhdGUgPT0gVFJVRSkgCisgICAgeworICAgICAgICAvKiBQYXJzZSBwYWNrZXRzICovCisgICAgICAgIHJjID0gY3BoX2Zsb3dfcGFyc2VfcGFja2V0KHBvcnQsIHNrYi0+ZGF0YSwgVFJVRSwgVFJVRSwgJmZsb3dfcnVsZSk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19wYXJzZV9wYWNrZXQsIHJjKCVkKSBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIEdldCBOb25lIGRlZmF1bHQgQ1BIIGRhdGEgZmxvdyBydWxlIGF0IGZpcnN0ICovCisgICAgICAgIGZsb3dfcnVsZS5pc19kZWZhdWx0ID0gRkFMU0U7CisgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgLyogR2V0IGRlZmF1bHQgQ1BIIGRhdGEgZmxvdyBydWxlIHNlY29uZGx5ICovCisgICAgICAgICAgICBmbG93X3J1bGUuaXNfZGVmYXVsdCA9IFRSVUU7CisgICAgICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBEbyBub3RoaW5nICovCisgICAgICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBtb2RpZnkgcGFja2V0ICovCisgICAgICAgIHJjID0gY3BoX2Zsb3dfbW9kX3BhY2tldChza2IsIFRSVUUsICZmbG93X3J1bGUsICZvZmZzZXQpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKTpmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfbW9kX3J4X3BhY2tldCwgcmMoJWQpIFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9kYXRhX2Zsb3dfdHgoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogQ1BIIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgdHJhc21pdGluZyBhcHBsaWNhdGlvbiBwYWNrZXRzIAorKgorKiBJTlBVVFM6CisqICAgICAgIHBvcnQgICAgICAgIC0gR21hYyBwb3J0IHRoZSBwYWNrZXQgZnJvbQorKiAgICAgICBkZXYgICAgICAgICAtIE5ldCBkZXZpY2UKKyogICAgICAgc2tiICAgICAgICAgLSBTS0IgYnVmZmVyIHRvIHJlY2VpdmUgcGFja2V0CisqICAgICAgIG1oICAgICAgICAgIC0gV2hldGhlciBoYXMgbWFydmVsbCBoZWFkZXIKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEuIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIDAuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX2RhdGFfZmxvd190eChJTlQzMiBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorICAgICAgICAgICAgICAgICAgICAgICBCT09MIG1oLCBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQoreworICAgIENQSF9GTE9XX0VOVFJZX1QgZmxvd19ydWxlOworICAgIElOVDMyICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICBCT09MICAgICAgICAgICAgIGxfbWg7CisgICAgQk9PTCAgICAgICAgICAgICBzdGF0ZSAgPSBGQUxTRTsKKyAgICBNVl9TVEFUVVMgICAgICAgIHJjICAgICA9IE1WX09LOworCisgICAgaWYgKE1WX1BPTl9QT1JUX0lEICE9IHBvcnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgY3BoX2RiX2dldF9wYXJhbShDUEhfREJfUEFSQU1fRkxPV19TVVBQT1JULCAmc3RhdGUpOworICAgIAorICAgIGlmIChzdGF0ZSA9PSBUUlVFKSAKKyAgICB7CisgICAgICAgIC8qIERlY2lkZSB3aGV0aGVyIG5lZWQgdG8gaGFuZGxlIE1hcnZlbGwgaGVhZGVyICovCisgICAgICAgIGxfbWggPSBtaDsKKyAgICAgICAgaWYgKFRSVUUgPT0gbXV0aWxzX2lzX2Zyd2RfYnJvYWRjYXN0X3BhY2tldChza2ItPmRhdGEpKQorICAgICAgICAgICAgICBsX21oID0gVFJVRTsKKworICAgICAgICAvKiBQYXJzZSBwYWNrZXRzICovCisgICAgICAgIHJjID0gY3BoX2Zsb3dfcGFyc2VfcGFja2V0KHBvcnQsIHNrYi0+ZGF0YSwgRkFMU0UsIGxfbWgsICZmbG93X3J1bGUpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfRVJSX0xFVkVMLCAiJXMoKTpmYWlsIHRvIGNhbGwgY3BoX2Zsb3dfcGFyc2VfcGFja2V0LCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IENQSCBkYXRhIGZsb3cgcnVsZSAqLworICAgICAgICBmbG93X3J1bGUuaXNfZGVmYXVsdCA9IEZBTFNFOworICAgICAgICByYyA9IGNwaF9mbG93X2dldF9ydWxlKCZmbG93X3J1bGUpOworICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEhhbmRsZSBtdWx0aWNhdCBwYWNrZXRzIGFzIHVuaWNhc3Qgb25lICovCisgICAgICAgICAgICBpZiAoZmxvd19ydWxlLnBhcnNlX2JtICYgQ1BIX0ZMT1dfUEFSU0VfTUNfUFJPVE8pIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmbG93X3J1bGUucGFyc2VfYm0gJj0gfkNQSF9GTE9XX1BBUlNFX01DX1BST1RPOworICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTVZfT0spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG93X3J1bGUuaXNfZGVmYXVsdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X2dldF9ydWxlLCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgZmxvd19ydWxlLmlzX2RlZmF1bHQgPSBUUlVFOworICAgICAgICAgICAgICAgIHJjID0gY3BoX2Zsb3dfZ2V0X3J1bGUoJmZsb3dfcnVsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X2dldF9ydWxlLCByYzwlZD4gXG4iLCBfX0ZVTkNUSU9OX18sIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogbW9kaWZ5IHBhY2tldCAqLworICAgICAgICByYyA9IGNwaF9mbG93X21vZF9wYWNrZXQoc2tiLCBsX21oLCAmZmxvd19ydWxlLCAmb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJjICE9IE1WX09LKQorICAgICAgICB7CisgICAgICAgICAgICBNVl9DUEhfUFJJTlQoQ1BIX0VSUl9MRVZFTCwgIiVzKCk6ZmFpbCB0byBjYWxsIGNwaF9mbG93X21vZF9yeF9wYWNrZXQsIHJjPCVkPiBcbiIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBTdHJpcCBUWCBNSCAqLworICAgICAgICBpZiAoVFJVRSA9PSBsX21oKSAKKyAgICAgICAgeworICAgICAgICAgICAgc2tiLT5kYXRhICArPSBNVl9FVEhfTUhfU0laRTsKKyAgICAgICAgICAgIHNrYi0+bGVuICAgLT0gTVZfRVRIX01IX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIG1vZGlmeSBwYWNrZXQgKi8KKyAgICAgICAgcmMgPSBjcGhfZmxvd19tb2RfZnJ3ZCgmZmxvd19ydWxlLCB0eF9zcGVjX291dCk7CisgICAgICAgIGlmIChyYyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgTVZfQ1BIX1BSSU5UKENQSF9FUlJfTEVWRUwsICIlcygpOmZhaWwgdG8gY2FsbCBjcGhfZmxvd19tb2RfZnJ3ZCwgcmM8JWQ+IFxuIiwgX19GVU5DVElPTl9fLCByYyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSAKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfcnhfZnVuYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSByZWNlaXZlZCBzcGVjaWFsIHBhY2tldHMgCisqICAgICAgICAgICAgICBmcm9tIG5ldHdvcmsgZHJpdmVyCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgcnhxICAgICAtIENQVSByZWNlaXZlZCBxdWV1ZQorKiAgICAgICBkZXYgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBwa3QgICAgIC0gTWFydmVsbCBwYWNrZXQgaW5mb3JtYXRpb24KKyogICAgICAgcnhfZGVzYyAtIFJYIGRlc2NyaXB0b3IKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGNwaF9yeF9mdW5jKGludCBwb3J0LCBpbnQgcnhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKK3sKKyAgICBVSU5UMzIgaWR4ICAgID0gMDsKKyAgICBJTlQzMiAgb2Zmc2V0ID0gMDsKKyAgICBVSU5UOCAgYnVmZls1MTJdOworCisgICAgTVZfQ1BIX0NMRUFOX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIlxuIik7CisgICAgTVZfQ1BIX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIkVudGVyXG4iKTsKKworICAgIGlmIChkZXYgPT0gTlVMTCB8fCBwa3QgPT0gTlVMTCB8fCByeF9kZXNjID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRrKCIlczogTlVMTCBQb2ludGVyIGRldiglcCkgcGt0KCVwKSByeF9kZXNjKCVwKVxuIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXYsIHBrdCwgcnhfZGVzYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocnhfZGVzYy0+cG5jSW5mbyAmIE5FVEFfUE5DX1JYX1NQRUNJQUwpCisgICAgeworICAgICAgICAvKiBSZWNlaXZlIGFwcGxpY2F0aW9uIHBhY2tldHMgKi8KKyAgICAgICAgaWYgKGNwaF9hcHBfcGFja2V0X3J4KHBvcnQsIGRldiwgKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKSwgcnhfZGVzYykpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICAvKiBIYW5kbGUgdGhlIGJyb2FkY2FzdCBwYWNrZXQgaW4gY2FzZSBpdCBpcyBlbmFibGVkICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9CQ19IQU5ETEUKKyAgICAgICAgaWYgKGNwaF9hcHBfcnhfYmMocG9ydCwgZGV2LCBwa3QsIHJ4X2Rlc2MpKQorICAgICAgICAgICAgcmV0dXJuOworI2VuZGlmIAorCisgICAgICAgIC8qIERvZXMgbm90IG1hdGNoIHdpdGggQ1BIIGFwcGxpY2F0aW9uIHJ1bGVzICovCisgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJTcGVjaWFsIHBrdCBhcnJpdmVkIGZyb20gcG9ydCglZCksIHdhcyBub3QgaGFuZGxlZC4gXG4iLCBwb3J0KTsKKyAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKSk7ICAKKyAgICAgICAgTVZfQ1BIX0NMRUFOX1BSSU5UKENQSF9ERUJVR19MRVZFTCwgIklucHV0IFBhY2tldCBmaXJzdCAyNCBieXRlczpcbiIpOworICAgICAgICBtZW1zZXQoYnVmZiwgMCwgc2l6ZW9mKGJ1ZmYpKTsKKyAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCA0ODsgaWR4KyspIHsKKyAgICAgICAgICAgIG9mZnNldCArPSBzcHJpbnRmKGJ1ZmYrb2Zmc2V0LCAiJTAyeCAiLCAqKCgoc3RydWN0IHNrX2J1ZmYgKikocGt0LT5vc0luZm8pKS0+ZGF0YSArIGlkeCkpOworICAgICAgICB9CisgICAgICAgIE1WX0NQSF9DTEVBTl9QUklOVChDUEhfREVCVUdfTEVWRUwsICAiJXNcbiIsIGJ1ZmYpOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8qIEhhbmRsZSByZWNlaXZlZCBkYXRhIGZsb3cgcGFja2V0cyAqLworI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgICAgIGlmIChjcGhfZGF0YV9mbG93X3J4KHBvcnQsIGRldiwgKHN0cnVjdCBza19idWZmICopKHBrdC0+b3NJbmZvKSwgcnhfZGVzYykpIHsKKyAgICAgICAgICAgIE1WX0NQSF9QUklOVChDUEhfREVCVUdfTEVWRUwsICJGbG93IG1hcHBpbmdcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjcGhfdHhfZnVuYygpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBDUEggZnVuY3Rpb24gdG8gaGFuZGxlIHRyYW5taXR0aW5nIHNwZWNpYWwgcGFja2V0cyAKKyogICAgICAgICAgICAgIHRvIG5ldHdvcmsgZHJpdmVyCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAgICAgLSBHbWFjIHBvcnQgdGhlIHBhY2tldCBmcm9tCisqICAgICAgIGRldiAgICAgICAgIC0gTmV0IGRldmljZQorKiAgICAgICBza2IgICAgICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogICAgICAgdHhfc3BlY19vdXQgLSBUWCBkZXNjcmlwdG9yCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX3R4X2Z1bmMoSU5UMzIgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCit7CisgICAgLyogVHJhbnNtaXQgYXBwbGljYXRpb24gcGFja2V0cyAqLworICAgIGlmIChjcGhfYXBwX3BhY2tldF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIFRyYW5zbWl0IGRhdGEgZmxvdyBwYWNrZXRzICovCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICBpZiAoY3BoX2RhdGFfZmxvd190eChwb3J0LCBkZXYsIHNrYiwgRkFMU0UsIHR4X3NwZWNfb3V0KSkKKyAgICAgICAgcmV0dXJuIDE7CisjZW5kaWYKKworICAgIC8qIFRyYW5zbWl0IGRhdGEgZmxvdyBwYWNrZXRzIGJ5IFVEUCBTb3VyY2UgUG9ydCBvciBEZXN0IFBvcnQgKi8KKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFCisgICAgaWYgKGNwaF91ZHBfcG9ydF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQorICAgICAgICByZXR1cm4gMTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX25ldGRldl9pbml0KCkKKyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoKKyogREVTQ1JJUFRJT046IEluaXRpYWxpemUgQ1BIIG5ldHdvcmsgZGV2aWNlCisqCisqIElOUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfT0suIAorKiAgICAgICBPbiBlcnJvciByZXR1cm5zIGVycm9yIGNvZGUgYWNjb3JkaW5nbHkuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSU5UMzIgY3BoX25ldGRldl9pbml0KFZPSUQpCit7CisgICAgVUlOVDMyIHBvcnRfaTsKKworICAgIC8qIFJldHJpZXZlIEV0aCBwb3J0IG51bWJlciwgYXMgaW4gbXZfZXRoX2luaXRfbW9kdWxlICovCisgICAgZ3NfbXZfZXRoX3BvcnRfbnVtID0gbXZDdHJsRXRoTWF4UG9ydEdldCgpOworCisgICAgaWYgKGdzX212X2V0aF9wb3J0X251bSA+IENPTkZJR19NVl9FVEhfUE9SVFNfTlVNKQorICAgICAgICBnc19tdl9ldGhfcG9ydF9udW0gPSBDT05GSUdfTVZfRVRIX1BPUlRTX05VTTsKKworICAgIC8qIEluaXRpYWxpemUgYXBwbGljYXRpb24gcGFja2V0IGhhbmRsaW5nICovCisgICAgY3BoX2FwcF9pbml0KCk7CisgICAgCisgICAgLyogSW5pdGlhbGl6ZSBVRFAgcG9ydCBtYXBwaW5nIGZlYXR1cmUgKi8gICAgCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIGNwaF91ZHBfdGFibGVfaW5pdCgpOworI2VuZGlmCisKKyAgICAvKiBJbml0aWFsaXplIGRhdGEgZmxvdyBtYXBwaW5nIGZlYXR1cmUgKi8KKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgIGNwaF9mbG93X2luaXQoKTsKKyNlbmRpZgorCisgICAgLyogUmVnaXN0ZXIgc3BlY2lhbCByZWNlaXZlIGNoZWNrIGZ1bmN0aW9uICovCisjaWZkZWYgQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMCisgICAgZm9yIChwb3J0X2kgPSAwO3BvcnRfaSA8IGdzX212X2V0aF9wb3J0X251bTsgcG9ydF9pKyspIHsKKyAgICAgICAgbXZfZXRoX3J4X3NwZWNpYWxfcHJvY19mdW5jKHBvcnRfaSwgY3BoX3J4X2Z1bmMpOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwgKi8KKworICAgIC8qIFJlZ2lzdGVyIHNwZWNpYWwgdHJhbnNtaXQgY2hlY2sgZnVuY3Rpb24gKi8KKyNpZmRlZiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwKKyAgICBmb3IgKHBvcnRfaSA9IDA7IHBvcnRfaSA8IGdzX212X2V0aF9wb3J0X251bTsgcG9ydF9pKyspIHsKKyAgICAgICAgbXZfZXRoX3R4X3NwZWNpYWxfY2hlY2tfZnVuYyhwb3J0X2ksIGNwaF90eF9mdW5jKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMICovCisgICAgcmV0dXJuIE1WX09LOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX25ldGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdlNTliYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfbmV0ZGV2LmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfbmV0ZGV2LmgKKyoKKyogREVTQ1JJUFRJT046IE1hcnZlbGwgQ1BIKENQSCBQYWNrZXQgSGFuZGxlcikgbmV0d29yayBkZXZpY2UgcGFydCBkZWZpbml0aW9uCisqCisqIERFUEVOREVOQ0lFUzoKKyogICAgICAgICAgICAgICBOb25lCisqCisqIENSRUFURUQgQlk6ICAgVmljdG9yR3UKKyoKKyogREFURSBDUkVBVEVEOiAxMURlYzIwMTEKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICAgICAgICAgUmV2aXNpb246IDEuMAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX01WX0NQSF9ORVRERVZfSF8KKyNkZWZpbmUgX01WX0NQSF9ORVRERVZfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisjaW5jbHVkZSA8bXZDb21tb24uaD4KKyNpbmNsdWRlIDxtdk9zLmg+CisjaW5jbHVkZSA8bXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5oPgorCisKKyNkZWZpbmUgTVZfQ1BIX01BU19VRFBfU1JDX1BPUlQgICAgICAgICAgOAorI2RlZmluZSBNVl9DUEhfTUFTX1VEUF9EU1RfUE9SVCAgICAgICAgICA4CisjZGVmaW5lIE1WX0NQSF9OVU1fTExJRCAgICAgICAgICAgICAgICAgIDgKKworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUKK3N0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjIHsKKyAgICBfX2JlMTYgICAgdWRwX3BvcnQ7CisgICAgc3RydWN0IG12X2V0aF90eF9zcGVjIHR4X3NwZWM7Cit9OworCitzdHJ1Y3QgbXZfcG9ydF90eF9zcGVjIHsKKyAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB1ZHBfc3JjW01WX0NQSF9NQVNfVURQX1NSQ19QT1JUXTsKKyAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB1ZHBfZHN0W01WX0NQSF9NQVNfVURQX0RTVF9QT1JUXTsKK307CisKK3ZvaWQgY3BoX3VkcF9zcGVjX3ByaW50X2FsbCh2b2lkKTsKK01WX1NUQVRVUyAgY3BoX3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKTsKK01WX1NUQVRVUyAgY3BoX3VkcF9kZXN0X3NwZWNfc2V0KGludCB0eF9wb3J0LCB1aW50MTZfdCB1ZHBfZGVzdF9wb3J0LCB1aW50OF90IHR4cCwgdWludDhfdCB0eHEsIHVpbnQxNl90IGZsYWdzLCB1aW50MzJfdCBod19jbWQpOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogY3BoX3JlY19za2IoKQorKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKgorKiBERVNDUklQVElPTjogU2VuZCBTS0IgcGFja2V0IHRvIGxpbnV4IG5ldHdvcmsgYW5kIGluY3Jlc2UgY291bnRlciAgCisqCisqIElOUFVUUzoKKyogICAgICAgcG9ydCAgICAtIEdtYWMgcG9ydCB0aGUgcGFja2V0IGZyb20KKyogICAgICAgc2tiICAgICAtIFNLQiBidWZmZXIgdG8gcmVjZWl2ZSBwYWNrZXQKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgTm9uZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitWT0lEIGNwaF9yZWNfc2tiKElOVDMyIHBvcnQsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNwaF9uZXRkZXZfaW5pdCgpCisqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqCisqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIENQSCBuZXR3b3JrIGRldmljZQorKgorKiBJTlBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIE1WX09LLiAKKyogICAgICAgT24gZXJyb3IgcmV0dXJucyBlcnJvciBjb2RlIGFjY29yZGluZ2x5LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0lOVDMyIGNwaF9uZXRkZXZfaW5pdChWT0lEKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX01WX0NQSF9ORVRERVZfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGU1NDBhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3BoL212X2NwaF9zeXNmcy5jCkBAIC0wLDAgKzEsMTIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCisKK1RoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciAKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbCAKK1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcyAKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yIAorb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuIAorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVEIAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWSAKK0RJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkgCitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLiAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKworICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSAKKyAgICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKKyAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAgICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgCitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIAorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIAorKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyAKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiAKK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2NwaF9zeXNmcy5jCisqCisqIERFU0NSSVBUSU9OOiBNYXJ2ZWxsIENQSChDUEggUGFja2V0IEhhbmRsZXIpIHN5c2ZzIGNvbW1hbmQgZGVmaW5pdGlvbiAKKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDIySmFuMjAxMworKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSA8Z2JlL212TmV0YS5oPgorI2luY2x1ZGUgPHBuYy9tdlBuYy5oPgorCisjaW5jbHVkZSAibXZfY3BoX2hlYWRlci5oIgorCitzdGF0aWMgc3NpemVfdCBjcGhfc3BlY19wcm9jX2hlbHAoQ0hBUiAqYnVmKQoreworICAgIElOVDMyIG9mZiA9IDA7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgaGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyB0aGlzIGhlbHBcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIGhlbHBfYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgYWRkaXRpb25hbCBoZWxwIGZvciBwYXJhbWV0ZXJzXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgc2hvd19hcHBfZGIgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBhbGwgaW5mb3JtYXRpb24gaW4gYXBwbGljYXRpb24gcnVsZSBkYXRhIGJhc2VcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfcGFyc2VfbmFtZSAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3lzZnMgcGFyc2luZyBydWxlIGRhdGEgYmFzZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgc2hvd19tb2RfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBzeXNmcyBtb2RpZmljYXRpb24gcnVsZSBkYXRhIGJhc2VcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHNob3dfZnJ3ZF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3lzZnMgbW9kaWZpY2F0aW9uIHJ1bGUgZGF0YSBiYXNlXG4iKTsKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHVkcF9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3BlY2lhbCB1ZHAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb3J0IGNvbmZpZ3VyYXRpb25cbiIpOyAgIAorI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBzaG93X2Zsb3dfcnVsZSAgICAgICAgICAgICAgICAgICAgICAgLSBzaG93IGZsb3cgbWFwcGluZyBydWxlcyBcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBjbGVhcl9mbG93X3J1bGUgICAgICAgICAgICAgICAgICAgICAgLSBjbGVhciBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBkZWxfZHNjcF9tYXAgICAgICAgICAgICAgICAgICAgICAgICAgLSBkZWxldGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlc1xuIik7CisjZW5kaWYKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwcm9maWxlX2lkIGFjdGl2ZV9wb3J0ICAgICAgICAgICAgICAgPiBzZXRfY29tcGxleCAgICAgLSBTZXQgVFBNIGNvbXBsZXggcHJvZmlsZSBJRCBhbmQgYWN0aXZlIEdNQUMgcG9ydCwgMDpHTUFDMCwgMTpHTUFDMSwgMjpQT04gTUFDXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBmZWF0dXJlIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgPiBzZXRfZmxhZyAgICAgICAgLSBTZXQgdGhlIHN1cHBvcnQgb2YgQ1BIIGZlYXR1cmU6IHJlZmVyIHRvIGJlbG93IGFkZGl0aW9uYWwgaW5mbywgc3RhdGUgMDpkaXNhYmxlLCAxOmVuYWJsZVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdGNvbnQgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgID4gc2V0X3Rjb250ICAgICAgIC0gU2V0IFQtQ09OVCBzdGF0ZSBpbiBDUEgsIFQtQ09OVCAwfjcsIHN0YXRlLCAxOmVuYWJsZSwgMDpkaXNhYmxlXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gaGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gdHJhY2VfbGV2ZWwgICAgIC0gU2V0IGNwaCB0cmFjZSBsZXZlbCBiaXRtYXAuIDB4MDE6ZGVidWcsIDB4MDI6aW5mbywgMHgwNDp3YXJuLCAweDA4OmVycm9yXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lIGJtKGhleCkgZGlyIHJ4KGhleCkgbWgoaGV4KSBldHkoaGV4KSBlc3R5IGlwdjR0eSBuaDEgbmgyIGljbXB0eSA+IGFkZF9wYXJzZSAgIC0gYWRkIHBhcnNpbmcgZmllbGQsIGRpciAwOlUvUywgMTpEL1MsIDI6Tm90IGNhcmVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGRlbF9wYXJzZSAgICAgICAtIGRlbGV0ZSBwYXJzaW5nIGZpZWxkXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSBibShoZXgpIHByb3RvX3R5cGUoaGV4KSBzdGF0ZSAgID4gYWRkX21vZCAgICAgICAgIC0gYWRkIG1vZGlmaWNhdGlvbiBmaWVsZCwgc3RhdGUgMDpkaWFibGUsIDE6ZW5hYmxlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfbW9kICAgICAgICAgLSBkZWxldGUgbW9kaWZpY2F0aW9uIGZpZWxkXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gbmFtZSBibShoZXgpIHRyZ19wb3J0IHRyZ19xdWV1ZSBnZW0gID4gYWRkX2Zyd2QgICAgICAgIC0gYWRkIGZvcndhcmRpbmcgZmllbGRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGRlbF9mcndkICAgICAgICAtIGRlbGV0ZSBmb3J3YXJkaW5nIGZpZWxkXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcGFyc2VfbmFtZSBtb2RfbmFtZSBmcndkX25hbWUgICAgICAgID4gYWRkX2FwcF9ydWxlICAgIC0gYWRkIGFwcGxpY2F0aW9uIHJ1bGVcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYXJzZV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBkZWxfYXBwX3J1bGUgICAgLSBkZWxldGUgYXBwbGljYXRpb24gcnVsZVxuIik7ICAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYXJzZV9uYW1lIG1vZF9uYW1lIGZyd2RfbmFtZSAgICAgICAgPiB1cGRhdGVfYXBwX3J1bGUgLSB1cGRhdGUgYXBwbGljYXRpb24gcnVsZVxuIik7ICAgIAorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHBhcnNlX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGdldF9hcHBfcnVsZSAgICAtIGdldCBhcHBsaWNhdGlvbiBydWxlXG4iKTsgICAgCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX3NyYyhkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9zcmMgICAgICAgICAtIHNldCB1ZHAgc291cmNlIHBvcnQgc3BlY2lhbCBUeCBiZWhhdmlvclxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gcCB1ZHBfZHN0KGRlYykgdHhwIHR4cSBmbGFncyBod19jbWQgID4gdWRwX2RzdCAgICAgICAgIC0gc2V0IHVkcCBkZXN0aW5hdGlvbiBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgIHxQYXJzZSBvdXRlciAgICB8UGFyc2UgaW5uZXIgICAgICAgICAgICAgfE1vZCBvdXRlciAgICAgIHxNb2QgSW5uZXIgICAgICB8Rm9yd2FyZFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gZGlyIHBhcnNlX2JtIG1oIGV0eSAgdHBpZCB2aWQgcGJpdHMgIHRwaWQgdmlkIHBiaXRzICBvcF90eXBlICB0cGlkIHZpZCBwYml0cyAgdHBpZCB2aWQgcGJpdHMgIHBvcnQgcXVldWUgaHdmX3F1ZXVlIGdlbSA+IGFkZF9mbG93X3J1bGUgLSBBZGQgZmxvdyBydWxlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBkaXIgcGFyc2VfYm0gbWggZXR5ICB0cGlkIHZpZCBwYml0cyAgdHBpZCB2aWQgcGJpdHMgID4gZGVsX2Zsb3dfcnVsZSAgIC0gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBkaXIgcGFyc2VfYm0gbWggZXR5ICB0cGlkIHZpZCBwYml0cyAgdHBpZCB2aWQgcGJpdHMgID4gZ2V0X2Zsb3dfcnVsZSAgIC0gZ2V0IGZsb3cgbWFwcGluZyBydWxlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBwYml0czAgcGJpdHMxIC4uLiBwYml0czYyIHBiaXRzNjMgICAgICAgICAgICAgICAgICAgID4gc2V0X2RzY3BfbWFwICAgIC0gc2V0IERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXNcbiIpOworI2VuZGlmCisgICAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19oZWxwX2FkZChDSEFSICpidWYpCit7CisgICAgSU5UMzIgb2ZmID0gMDsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiQ1BIIGFkZGl0aW9uYWwgaGVscCBmb3IgcGFyYW1ldGVyc1xuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIltHZW5lcmljIFBhcmFtZXRlcnNdXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZmVhdHVyZTpcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAwOkdlbmVyaWMgYXBwbGljYXRpb24sIDE6SUdNUC9NTEQgc3VwcG9ydCwgMjpCcm9hZGNhc3Qgc3VwcG9ydCwgMzpEYXRhIGZsb3cgbWFwcGluZyBzdXBwb3J0LCA0OiBVRFAgcG9ydCBtYXBwaW5nIHN1cHBvcnRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJbQXBwIFBhcmFtZXRlcnNdXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAicGFyc2UgYm06XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgwMTpQQVJTRV9GSUVMRF9ESVIgICAgICAgICAgICAgIDB4MDI6UEFSU0VfRklFTERfTUggICAgICAgICAgICAgICAweDA0OlBBUlNFX0ZJRUxEX0VUSF9UWVBFICAgICAgICAgMHgwODpQQVJTRV9GSUVMRF9FVEhfU1VCVFlQRVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDB4MTA6UEFSU0VfRklFTERfSVBWNF9UWVBFICAgICAgICAweDIwOlBBUlNFX0ZJRUxEX0lQVjZfTkgxICAgICAgICAgMHg0MDpQQVJTRV9GSUVMRF9JUFY2X05IMiAgICAgICAgIDB4ODA6UEFSU0VfRklFTERfSUNNUFY2X1RZUEVcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJkaXI6IDA6IFUvUywgMTpEL1MsIDI6IE5vdCBjYXJlXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAicng6IDA6IFJYLCAxOlRYXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAibW9kIGJtOlxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDB4MDE6UlhfTU9EX0FERF9HTUFDICAgICAgICAgICAgICAweDAyOlJYX01PRF9SRVBMQUNFX1BST1RPX1RZUEUgICAgMHgwNDpSWF9NT0RfU1RSSVBfTUggICAgICAgICAgICAgIDB4MDg6VFhfTU9EX0FERF9NSF9CWV9EUklWRVJcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDEwOkNQSF9BUFBfVFhfTU9EX05PX1BBRCAgICAgICAgMHgyMDpNT0RfU0VUX1NUQVRFXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZnJ3ZCBibTpcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICIgICAweDAxOkZSV0RfU0VUX1RSR19QT1JUICAgICAgICAgICAgMHgwMjpGUldEX1NFVF9UUkdfUVVFVUUgICAgICAgICAgIDB4MDQ6RlJXRF9TRVRfR0VNX1BPUlRcbiIpOworICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJbRmxvdyBQYXJhbWV0ZXJzXVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImRpcjogMDogVS9TLCAxOkQvUywgMjogTm90IGNhcmVcbiIpOyAgICAKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiYm06XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMHgwMTpQQVJTRV9NSCAgICAgICAgICAgICAgICAgICAgIDB4MDI6UEFSU0VfRVhUX1ZMQU4gICAgICAgICAgICAgICAweDA0OlBBUlNFX1RXT19WTEFOICAgICAgICAgICAgICAgMHgwODpQQVJTRV9FVEhfVFlQRVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm1oKGhleCksIGV0eShoZXgpLCB0cGlkKGhleCksIHZpZChkZWMpLCBwYml0cyhkZWMpXG4iKTsgICAgCisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIm9wX3R5cGU6XG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDA6QVNJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxOkRJU0NBUkQgICAgICAgICAgICAgICAgICAgICAgICAwMjpBREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDM6QUREX0NPUFlfRFNDUFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDA0OkFERF9DT1BZX09VVEVSX1BCSVQgICAgICAgICAgICAwNTpBRERfQ09QWV9JTk5FUl9QQklUICAgICAgICAgICAgMDY6QUREXzJfVEFHUyAgICAgICAgICAgICAgICAgICAgIDA3OkFERF8yX1RBR1NfQ09QWV9EU0NQXG4iKTsKKyAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiICAgMDg6QUREXzJfVEFHU19DT1BZX1BCSVQgICAgICAgICAgIDA5OlJFTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDpSRU1fMl9UQUdTICAgICAgICAgICAgICAgICAgICAgMTE6UkVQTEFDRVxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDEyOlJFUExBQ0VfVklEICAgICAgICAgICAgICAgICAgICAxMzpSRVBMQUNFX1BCSVQgICAgICAgICAgICAgICAgICAgMTQ6UkVQTEFDRV9JTk5FUl9BRERfT1VURVIgICAgICAgIDE1OlJFUExBQ0VfSU5ORVJfQUREX09VVEVSX0NPUFlfUEJJVFxuIik7CisgICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgIiAgIDE2OlJFUExBQ0VfSU5ORVJfUkVNX09VVEVSICAgICAgICAxNzpSRVBMQUNFXzJUQUdTICAgICAgICAgICAgICAgICAgMTg6UkVQTEFDRV8yVEFHU19WSUQgICAgICAgICAgICAgIDE5OlNXQVBcbiIpOworICAKKyAgICByZXR1cm4gb2ZmOworfQorCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2luZyBmaWVsZCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX1NZU0ZTX1BBUlNFX1QgY3BoX3N5c2ZzX3BhcnNlX3RhYmxlW0NQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlldOworCitzdGF0aWMgQ1BIX1NZU0ZTX1JVTEVfVCBjcGhfcGFyc2VfcnVsZV9kYiA9Cit7CisgICAgLm1heF9lbnRyeV9udW0gICAgPSBDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZLAorICAgIC5lbnRyeV9udW0gICAgICAgID0gMCwKKyAgICAuZW50cnlfc2l6ZSAgICAgICA9IHNpemVvZihDUEhfU1lTRlNfUEFSU0VfVCksCisgICAgLmVudHJ5X2FyYSAgICAgICAgPSBjcGhfc3lzZnNfcGFyc2VfdGFibGUKK307CisKK3N0YXRpYyBWT0lEIGNwaF9zeXNmc19pbml0X3BhcnNlX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19QQVJTRV9UICopY3BoX3BhcnNlX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICAvL3ByaW50ayhLRVJOX0lORk8gIiVzOiBJbml0IERCXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIHBfZW50cnktPm5hbWVbMF0gPSAwOworICAgIH0KK30KKworQ1BIX1NZU0ZTX1BBUlNFX1QgKmNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfUEFSU0VfVCAqcF9lbnRyeSA9IChDUEhfU1lTRlNfUEFSU0VfVCAqKWNwaF9wYXJzZV9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX3BhcnNlX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NQSF9TWVNGU19QQVJTRV9UICpjcGhfc3lzZnNfZmluZF9mcmVlX3BhcnNlX2VudHJ5KFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9wYXJzZV9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5uYW1lWzBdICA9IDA7CisgICAgICAgICAgICBwX2VudHJ5LT5wYXJzZV9ibSA9IDA7CisgICAgICAgICAgICBtZW1zZXQoJnBfZW50cnktPnBhcnNlX2tleSwgMCwgc2l6ZW9mKHBfZW50cnktPnBhcnNlX2tleSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X3BhcnNlX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX1BBUlNFX1QgKiljcGhfcGFyc2VfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfcGFyc2VfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUGFyc2UgZW50cnkoJWQpIG5hbWUoJXMpXG4iLCBpZHgsIHBfZW50cnktPm5hbWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfcGFyc2VfZmllbGQocF9lbnRyeS0+cGFyc2VfYm0sICZwX2VudHJ5LT5wYXJzZV9rZXkpOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZpY2F0aW9uIGZpZWxkIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ1BIX1NZU0ZTX01PRF9UIGNwaF9zeXNmc19tb2RfdGFibGVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWV07CisKK3N0YXRpYyBDUEhfU1lTRlNfUlVMRV9UIGNwaF9tb2RfcnVsZV9kYiA9Cit7CisgICAgLm1heF9lbnRyeV9udW0gICAgPSBDUEhfU1lTRlNfRklFTERfTUFYX0VOVFJZLAorICAgIC5lbnRyeV9udW0gICAgICAgID0gMCwKKyAgICAuZW50cnlfc2l6ZSAgICAgICA9IHNpemVvZihDUEhfU1lTRlNfTU9EX1QpLAorICAgIC5lbnRyeV9hcmEgICAgICAgID0gY3BoX3N5c2ZzX21vZF90YWJsZQorfTsKKworc3RhdGljIFZPSUQgY3BoX3N5c2ZzX2luaXRfbW9kX2RiKFZPSUQpCit7CisgICAgQ1BIX1NZU0ZTX01PRF9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfTU9EX1QgKiljcGhfbW9kX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgLy9wcmludGsoS0VSTl9JTkZPICIlczogSW5pdCBEQlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgcF9lbnRyeS0+bmFtZVswXSA9IDA7CisgICAgfQorfQorCitDUEhfU1lTRlNfTU9EX1QgKmNwaF9zeXNmc19maW5kX21vZF9lbnRyeV9ieV9uYW1lKENIQVIgKm5hbWUpCit7CisgICAgQ1BIX1NZU0ZTX01PRF9UICAqcF9lbnRyeSA9IChDUEhfU1lTRlNfTU9EX1QgKiljcGhfbW9kX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfbW9kX3J1bGVfZGIubWF4X2VudHJ5X251bTsgaWR4KyssIHBfZW50cnkrKykKKyAgICB7CisgICAgICAgIGlmIChzdHJjbXAocF9lbnRyeS0+bmFtZSwgbmFtZSkgPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0NQSF9TWVNGU19NT0RfVCAqY3BoX3N5c2ZzX2ZpbmRfZnJlZV9tb2RfZW50cnkoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfTU9EX1QgICpwX2VudHJ5ID0gKENQSF9TWVNGU19NT0RfVCAqKWNwaF9tb2RfcnVsZV9kYi5lbnRyeV9hcmE7CisgICAgSU5UMzIgICAgICAgICAgICAgaWR4ICAgICA9IDA7CisKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGNwaF9tb2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9tb2RfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX21vZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfZW50cnktPm5hbWVbMF0gPSAwOworICAgICAgICAgICAgcF9lbnRyeS0+bW9kX2JtICA9IDA7CisgICAgICAgICAgICBtZW1zZXQoJnBfZW50cnktPm1vZF92YWx1ZSwgMCwgc2l6ZW9mKHBfZW50cnktPm1vZF92YWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X21vZF9kYihWT0lEKQoreworICAgIENQSF9TWVNGU19NT0RfVCAgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX01PRF9UICopY3BoX21vZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX21vZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAocF9lbnRyeS0+bmFtZVswXSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJNb2QgZW50cnkoJWQpIG5hbWUoJXMpXG4iLCBpZHgsIHBfZW50cnktPm5hbWUpOworICAgICAgICAgICAgY3BoX2RiX2Rpc3BsYXlfbW9kX2ZpZWxkKHBfZW50cnktPm1vZF9ibSwgJnBfZW50cnktPm1vZF92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBGb3J3YXJkaW5nIGZpZWxkIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDUEhfU1lTRlNfRlJXRF9UIGNwaF9zeXNmc19mcndkX3RhYmxlW0NQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlldOworCitzdGF0aWMgQ1BIX1NZU0ZTX1JVTEVfVCBjcGhfZnJ3ZF9ydWxlX2RiID0KK3sKKyAgICAubWF4X2VudHJ5X251bSAgICA9IENQSF9TWVNGU19GSUVMRF9NQVhfRU5UUlksCisgICAgLmVudHJ5X251bSAgICAgICAgPSAwLAorICAgIC5lbnRyeV9zaXplICAgICAgID0gc2l6ZW9mKENQSF9TWVNGU19GUldEX1QpLAorICAgIC5lbnRyeV9hcmEgICAgICAgID0gY3BoX3N5c2ZzX2Zyd2RfdGFibGUKK307CisKK3N0YXRpYyBWT0lEIGNwaF9zeXNmc19pbml0X2Zyd2RfZGIoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEluaXQgREJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfZnJ3ZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICB9Cit9CisKK0NQSF9TWVNGU19GUldEX1QgKmNwaF9zeXNmc19maW5kX2Zyd2RfZW50cnlfYnlfbmFtZShDSEFSICpuYW1lKQoreworICAgIENQSF9TWVNGU19GUldEX1QgKnBfZW50cnkgPSAoQ1BIX1NZU0ZTX0ZSV0RfVCAqKWNwaF9mcndkX3J1bGVfZGIuZW50cnlfYXJhOworICAgIElOVDMyICAgICAgICAgICAgIGlkeCAgICAgPSAwOworCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBjcGhfZnJ3ZF9ydWxlX2RiLm1heF9lbnRyeV9udW07IGlkeCsrLCBwX2VudHJ5KyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKHBfZW50cnktPm5hbWUsIG5hbWUpID09IDApIAorICAgICAgICAgICAgcmV0dXJuIHBfZW50cnk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDUEhfU1lTRlNfRlJXRF9UICpjcGhfc3lzZnNfZmluZF9mcmVlX2Zyd2RfZW50cnkoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gPT0gMCkgCisgICAgICAgICAgICByZXR1cm4gcF9lbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0JPT0wgY3BoX3N5c2ZzX2RlbF9mcndkX2VudHJ5X2J5X25hbWUoQ0hBUiAqbmFtZSkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHN0cmNtcChwX2VudHJ5LT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwX2VudHJ5LT5uYW1lWzBdID0gMDsKKyAgICAgICAgICAgIHBfZW50cnktPmZyd2RfYm0gPSAwOworICAgICAgICAgICAgbWVtc2V0KCZwX2VudHJ5LT5mcndkX3ZhbHVlLCAwLCBzaXplb2YocF9lbnRyeS0+ZnJ3ZF92YWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitWT0lEIGNwaF9zeXNmc19zaG93X2Zyd2RfZGIoVk9JRCkKK3sKKyAgICBDUEhfU1lTRlNfRlJXRF9UICpwX2VudHJ5ID0gKENQSF9TWVNGU19GUldEX1QgKiljcGhfZnJ3ZF9ydWxlX2RiLmVudHJ5X2FyYTsKKyAgICBJTlQzMiAgICAgICAgICAgICBpZHggICAgID0gMDsKKworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgY3BoX2Zyd2RfcnVsZV9kYi5tYXhfZW50cnlfbnVtOyBpZHgrKywgcF9lbnRyeSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBfZW50cnktPm5hbWVbMF0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRnJ3ZCBlbnRyeSglZCkgbmFtZSglcylcbiIsIGlkeCwgcF9lbnRyeS0+bmFtZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKHBfZW50cnktPmZyd2RfYm0sICZwX2VudHJ5LT5mcndkX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgIFNZUyBGUyBQYXJzaW5nIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIENIQVIgKmJ1ZikKK3sKKyAgICBJTlQzMiAgICAgICBvZmYgID0gMDsKKyAgICBjb25zdCBDSEFSICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgaWYgKCFzdHJjbXAobmFtZSwgImhlbHAiKSApIHsKKyAgICAgICAgb2ZmID0gY3BoX3NwZWNfcHJvY19oZWxwKGJ1Zik7CisgICAgfQorICAgIGlmICghc3RyY21wKG5hbWUsICJoZWxwX2FkZCIpICkgeworICAgICAgICBvZmYgPSBjcGhfc3BlY19wcm9jX2hlbHBfYWRkKGJ1Zik7CisgICAgfSAgICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzaG93X2FwcF9kYiIpICkgeworICAgICAgICBjcGhfZGJfZGlzcGxheV9hbGwoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2hvd19wYXJzZV9uYW1lIikgKSB7CisgICAgICAgIGNwaF9zeXNmc19zaG93X3BhcnNlX2RiKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfbW9kX25hbWUiKSApIHsKKyAgICAgICAgY3BoX3N5c2ZzX3Nob3dfbW9kX2RiKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfZnJ3ZF9uYW1lIikgKSB7CisgICAgICAgIGNwaF9zeXNmc19zaG93X2Zyd2RfZGIoKTsKKyAgICB9CisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRSAgICAgICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1ZHBfcG9ydHMiKSkgeworICAgICAgICBjcGhfdWRwX3NwZWNfcHJpbnRfYWxsKCk7CisgICAgfQorI2VuZGlmICAgIAorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFICAgICAgICAgIAorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNob3dfZmxvd19ydWxlIikpIHsKKyAgICAgICAgY3BoX2Zsb3dfZGlzcGxheV9hbGwoKTsKKyAgICB9IAorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImNsZWFyX2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIGNwaF9mbG93X2NsZWFyX3J1bGUoKTsKKyAgICB9ICAKKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfZHNjcF9tYXAiKSkgeworICAgICAgICBjcGhfZmxvd19kZWxfZHNjcF9tYXAoKTsKKyAgICB9ICAgICAKKyNlbmRpZiAgICAKKyAgICBlbHNlCisgICAgICAgIG9mZiA9IGNwaF9zcGVjX3Byb2NfaGVscChidWYpOworCisgICAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY18xX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVMT05HICAgICAgIGZsYWdzID0gMDsgICAgCisgICAgTVZfU1RBVFVTICAgcmMgICAgPSAgTVZfT0s7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAvKiBSZWFkIGlucHV0ICovCisgICAgc3NjYW5mKGJ1ZiwgIiV4IiwgJnYxKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInRyYWNlX2xldmVsIikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X3RyYWNlX2ZsYWcodjEpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgdHJhY2UgbGV2ZWw8MHgleD5cbiIsIHYxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gc2V0IHRyYWNlIGxldmVsPDB4JXg+XG4iLCB2MSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY18yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYyICAgID0gMDsKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7ICAgIAorICAgIE1WX1NUQVRVUyAgIHJjICAgID0gIE1WX09LOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAlZCIsICZ2MSwgJnYyKTsKKworICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgCisgICAgaWYgKCFzdHJjbXAobmFtZSwgInNldF9jb21wbGV4IikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X2NvbXBsZXhfcHJvZmlsZSh2MSwgdjIpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBzZXQgY29tcGxleCBwcm9maWxlPCVkPiBhY3RpdmUgcG9ydDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCBjb21wbGV4IHByb2ZpbGU8JWQ+IGFjdGl2ZSBwb3J0PCVkPlxuIiwgdjEsIHYyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzZXRfZmxhZyIpKSB7CisgICAgICAgIHJjID0gY3BoX3NldF9mZWF0dXJlX2ZsYWcodjEsIHYyKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gc2V0IGZlYXR1cmU8JWQ+IHRvIDwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIHNldCBmZWF0dXJlPCVkPiB0bzwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2V0X3Rjb250IikpIHsKKyAgICAgICAgcmMgPSBjcGhfc2V0X3Rjb250X3N0YXRlKHYxLCB2Mik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIHNldCB0Y29udDwlZD4gdG8gPCVkPlxuIiwgdjEsIHYyKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gc2V0IHRjb250PCVkPiB0bzwlZD5cbiIsIHYxLCB2Mik7CisgICAgICAgIH0KKyAgICB9ICAgIAorICAgIGVsc2UKKyAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCisgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfbmFtZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIENIQVIgICAgICAgIG5hbWUxW0NQSF9TWVNGU19GSUVMRF9NQVhfTEVOKzFdOworICAgIFVJTlQzMiAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MiAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjMgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY0ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjYgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY3ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2OCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjkgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYxMCAgID0gMDsKKyAgICBVTE9ORyAgICAgICBmbGFncyA9IDA7CisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfcGFyc2VfZW50cnkgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICpwX21vZF9lbnRyeSAgID0gTlVMTDsKKyAgICBDUEhfU1lTRlNfRlJXRF9UICAqcF9mcndkX2VudHJ5ICA9IE5VTEw7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKworICAgIGlmICghc3RyY21wKG5hbWUsICJhZGRfcGFyc2UiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAlZCAlZCAlZCAleCAlZCAlZCAlZCAlZCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzLCAmdjQsICZ2NSwgJnY2LCAmdjcsICZ2OCwgJnY5LCAmdjEwKTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgIAorICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKHBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiQWxyZWFkeSBoYXMgdGhlIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKworICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJlZV9wYXJzZV9lbnRyeSgpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJObyBmcmVlIHBhcnNlIGVudHJ5XG4iKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdHJjcHkocF9wYXJzZV9lbnRyeS0+bmFtZSwgbmFtZTEpOworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSAgICAgICAgICAgICAgPSB2MTsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmRpciAgICAgICAgID0gdjI7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5yeF90eCAgICAgICA9IHYzOworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkubWggICAgICAgICAgPSB2NDsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmV0aF90eXBlICAgID0gdjU7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5ldGhfc3VidHlwZSA9IHY2OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuaXB2NF90eXBlICAgPSB2NzsKKyAgICAgICAgcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LmlwdjZfbmgxICAgID0gdjg7CisgICAgICAgIHBfcGFyc2VfZW50cnktPnBhcnNlX2tleS5pcHY2X25oMiAgICA9IHY5OworICAgICAgICBwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXkuaWNtcHY2X3R5cGUgPSB2MTA7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworCisgICAgICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFkZF9tb2QiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAleCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzKTsKKworICAgICAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworICAgICAgICAKKyAgICAgICAgcF9tb2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKHBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIkFscmVhZHkgaGFzIHRoZSBtb2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorCisgICAgICAgIHBfbW9kX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJlZV9tb2RfZW50cnkoKTsKKyAgICAgICAgaWYoIXBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIk5vIGZyZWUgbW9kIGVudHJ5XG4iKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisKKyAgICAgICAgc3RyY3B5KHBfbW9kX2VudHJ5LT5uYW1lLCBuYW1lMSk7CisgICAgICAgIHBfbW9kX2VudHJ5LT5tb2RfYm0gICAgICAgICAgICAgICAgPSB2MTsKKyAgICAgICAgcF9tb2RfZW50cnktPm1vZF92YWx1ZS5wcm90b190eXBlICA9IHYyOworICAgICAgICBpZiAodjMpCisgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX3ZhbHVlLnN0YXRlICAgPSBUUlVFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX3ZhbHVlLnN0YXRlICAgPSBGQUxTRTsKKyAgICAgICAgCisgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgbW9kIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICAKKyAgICAgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX2Zyd2QiKSkgeworICAgICAgICAvKiBSZWFkIGlucHV0ICovCisgICAgICAgIHNzY2FuZihidWYsICIlcyAleCAlZCAlZCAlZCIsIG5hbWUxLCAmdjEsICZ2MiwgJnYzLCAmdjQpOworCisgICAgICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgIAorICAgICAgICBwX2Zyd2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZihwX2Zyd2RfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiQWxyZWFkeSBoYXMgdGhlIGZyd2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorCisgICAgICAgIHBfZnJ3ZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX2ZyZWVfZnJ3ZF9lbnRyeSgpOworICAgICAgICBpZighcF9mcndkX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoIk5vIGZyZWUgZnJ3ZCBlbnRyeVxuIik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3RyY3B5KHBfZnJ3ZF9lbnRyeS0+bmFtZSwgbmFtZTEpOworICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfYm0gICAgICAgICAgICAgID0gdjE7CisgICAgICAgIHBfZnJ3ZF9lbnRyeS0+ZnJ3ZF92YWx1ZS50cmdfcG9ydCAgPSB2MjsKKyAgICAgICAgcF9mcndkX2VudHJ5LT5mcndkX3ZhbHVlLnRyZ19xdWV1ZSA9IHYzOworICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUuZ2VtX3BvcnQgID0gdjQ7CisgICAgICAgIAorICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIGZyd2QgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisKKyAgICAgICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyAgICB9ICAgCisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgQ0hBUiAgICAgICAgbmFtZTFbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ0hBUiAgICAgICAgbmFtZTJbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ0hBUiAgICAgICAgbmFtZTNbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07ICAgIAorICAgIFVMT05HICAgICAgIGZsYWdzID0gMDsKKyAgICBNVl9TVEFUVVMgICByYyAgICA9ICBNVl9PSzsgICAgCisgICAgQ1BIX1NZU0ZTX1BBUlNFX1QgKnBfcGFyc2VfZW50cnkgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICpwX21vZF9lbnRyeSAgID0gTlVMTDsgICAgCisgICAgQ1BIX1NZU0ZTX0ZSV0RfVCAgKnBfZnJ3ZF9lbnRyeSAgPSBOVUxMOworICAgIENQSF9TWVNGU19NT0RfVCAgICBtb2RfZW50cnk7ICAgIAorICAgIENQSF9TWVNGU19GUldEX1QgICBmcndkX2VudHJ5OworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlcyAlcyAlcyIsIG5hbWUxLCBuYW1lMiwgbmFtZTMpOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX2FwcF9ydWxlIikpIHsKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgcGFyc2UgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICBwX21vZF9lbnRyeSA9IGNwaF9zeXNmc19maW5kX21vZF9lbnRyeV9ieV9uYW1lKG5hbWUyKTsKKyAgICAgICAgaWYoIXBfbW9kX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBtb2QgbmFtZSA8JXM+XG4iLCBuYW1lMik7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICBwX2Zyd2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTMpOworICAgICAgICBpZighcF9mcndkX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBmcndkIG5hbWUgPCVzPlxuIiwgbmFtZTMpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0gICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICByYyA9IGNwaF9hZGRfYXBwX3J1bGUocF9wYXJzZV9lbnRyeS0+cGFyc2VfYm0sICZwX3BhcnNlX2VudHJ5LT5wYXJzZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21vZF9lbnRyeS0+bW9kX2JtLCAmcF9tb2RfZW50cnktPm1vZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZnJ3ZF9lbnRyeS0+ZnJ3ZF9ibSwgJnBfZnJ3ZF9lbnRyeS0+ZnJ3ZF92YWx1ZSk7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBhcHAgcnVsZVxuIik7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJGYWlsIHRvIGFkZCBhcHAgcnVsZVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2FwcF9ydWxlIikpIHsKKyAgICAgICAgcF9wYXJzZV9lbnRyeSA9IGNwaF9zeXNmc19maW5kX3BhcnNlX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZighcF9wYXJzZV9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgcGFyc2UgbmFtZSA8JXM+XG4iLCBuYW1lMSk7ICAgIAorICAgICAgICAgICAgcmV0dXJuIC1FUEVSTTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZGVsX2FwcF9ydWxlKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIGFwcCBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVwZGF0ZV9hcHBfcnVsZSIpKSB7CisgICAgICAgIHBfcGFyc2VfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9wYXJzZV9lbnRyeV9ieV9uYW1lKG5hbWUxKTsKKyAgICAgICAgaWYoIXBfcGFyc2VfZW50cnkpIHsKKyAgICAgICAgICAgIHByaW50aygiYWRkX2FwcF9ydWxlOiBpbnZhbGlkIHBhcnNlIG5hbWUgPCVzPlxuIiwgbmFtZTEpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9tb2RfZW50cnkgPSBjcGhfc3lzZnNfZmluZF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMik7CisgICAgICAgIGlmKCFwX21vZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgbW9kIG5hbWUgPCVzPlxuIiwgbmFtZTIpOyAgICAKKyAgICAgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgICAgIH0KKyAgICAgICAgcF9mcndkX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfZnJ3ZF9lbnRyeV9ieV9uYW1lKG5hbWUzKTsKKyAgICAgICAgaWYoIXBfZnJ3ZF9lbnRyeSkgeworICAgICAgICAgICAgcHJpbnRrKCJhZGRfYXBwX3J1bGU6IGludmFsaWQgZnJ3ZCBuYW1lIDwlcz5cbiIsIG5hbWUzKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9ICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfdXBkYXRlX2FwcF9ydWxlKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tb2RfZW50cnktPm1vZF9ibSwgJnBfbW9kX2VudHJ5LT5tb2RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2Zyd2RfZW50cnktPmZyd2RfYm0sICZwX2Zyd2RfZW50cnktPmZyd2RfdmFsdWUpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byB1cGRhdGUgYXBwIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byB1cGRhdGUgYXBwIHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJnZXRfYXBwX3J1bGUiKSkgeworICAgICAgICBwX3BhcnNlX2VudHJ5ID0gY3BoX3N5c2ZzX2ZpbmRfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmKCFwX3BhcnNlX2VudHJ5KSB7CisgICAgICAgICAgICBwcmludGsoImFkZF9hcHBfcnVsZTogaW52YWxpZCBwYXJzZSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsgICAgCisgICAgICAgICAgICByZXR1cm4gLUVQRVJNOworICAgICAgICB9CisgICAgICAgCisgICAgICAgIHJjID0gY3BoX2dldF9hcHBfcnVsZShwX3BhcnNlX2VudHJ5LT5wYXJzZV9ibSwgJnBfcGFyc2VfZW50cnktPnBhcnNlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RfZW50cnkubW9kX2JtLCAmbW9kX2VudHJ5Lm1vZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcndkX2VudHJ5LmZyd2RfYm0sICZmcndkX2VudHJ5LmZyd2RfdmFsdWUpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X3BhcnNlX2ZpZWxkKHBfcGFyc2VfZW50cnktPnBhcnNlX2JtLCAmcF9wYXJzZV9lbnRyeS0+cGFyc2Vfa2V5KTsKKyAgICAgICAgICAgIGNwaF9kYl9kaXNwbGF5X21vZF9maWVsZChtb2RfZW50cnkubW9kX2JtLCAmbW9kX2VudHJ5Lm1vZF92YWx1ZSk7CisgICAgICAgICAgICBjcGhfZGJfZGlzcGxheV9mcndkX2ZpZWxkKGZyd2RfZW50cnkuZnJ3ZF9ibSwgJmZyd2RfZW50cnkuZnJ3ZF92YWx1ZSk7CisgICAgICAgIH0gCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRrKCJObyB2YWxpZCBDUEggYXBwIHJ1bGVcbiIpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfcGFyc2UiKSkgeworICAgICAgICByYyA9IGNwaF9zeXNmc19kZWxfcGFyc2VfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmIChyYyA9PSBUUlVFKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIHBhcnNlIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBkZWxldGUgcGFyc2UgZmllbGQgYnkgbmFtZSA8JXM+XG4iLCBuYW1lMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX21vZCIpKSB7CisgICAgICAgIHJjID0gY3BoX3N5c2ZzX2RlbF9tb2RfZW50cnlfYnlfbmFtZShuYW1lMSk7CisgICAgICAgIGlmIChyYyA9PSBUUlVFKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gZGVsZXRlIG1vZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGsoIkZhaWwgdG8gZGVsZXRlIG1vZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJkZWxfZnJ3ZCIpKSB7CisgICAgICAgIHJjID0gY3BoX3N5c2ZzX2RlbF9mcndkX2VudHJ5X2J5X25hbWUobmFtZTEpOworICAgICAgICBpZiAocmMgPT0gVFJVRSkgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGRlbGV0ZSBmcndkIGZpZWxkIGJ5IG5hbWUgPCVzPlxuIiwgbmFtZTEpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBkZWxldGUgZnJ3ZCBmaWVsZCBieSBuYW1lIDwlcz5cbiIsIG5hbWUxKTsKKyAgICAgICAgfSAgCisgICAgfSAgICAKKyAgICBlbHNlCisgICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKKworICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gbGVuOworfQorCisjaWZkZWYgQ09ORklHX01WX0NQSF9VRFBfU0FNUExFX0hBTkRMRQorc3RhdGljIHNzaXplX3QgY3BoX3NwZWNfcHJvY191ZHBfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSEFSICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgY29uc3QgQ0hBUiAqbmFtZSAgPSBhdHRyLT5hdHRyLm5hbWU7CisgICAgVUlOVDMyICAgICAgdjEgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHYyICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2MyAgICA9IDA7CisgICAgVUlOVDMyICAgICAgdjQgICAgPSAwOworICAgIFVJTlQzMiAgICAgIHY1ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICB2NiAgICA9IDA7CisgICAgVUxPTkcgICAgICAgZmxhZ3MgPSAwOworICAgIE1WX1NUQVRVUyAgIHJjICAgID0gIE1WX09LOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAlZCAleCAleCAleCAleCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYpOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKyAgICAKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyYyIpKSB7CisgICAgICAgIHJjID0gY3BoX3VkcF9zcmNfc3BlY19zZXQodjEsIHYyLCB2MywgdjQsIHY1LCB2Nik7CisgICAgICAgIGlmIChyYyA9PSBNVl9PSykgeworICAgICAgICAgICAgcHJpbnRrKCJTdWNjZWVkIHRvIGFkZCBVRFAgc3JjIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgVURQIHNyYyBydWxlXG4iKTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVkcF9kc3QiKSkgeworICAgICAgICByYyA9IGNwaF91ZHBfZGVzdF9zcGVjX3NldCh2MSwgdjIsIHYzLCB2NCwgdjUsIHY2KTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gYWRkIFVEUCBkZXN0IHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgVURQIGRlc3QgcnVsZVxuIik7CisgICAgICAgIH0gICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisgICAgcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKK3N0YXRpYyBzc2l6ZV90IGNwaF9zcGVjX3Byb2NfZmxvd19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgICAgKm5hbWUgID0gYXR0ci0+YXR0ci5uYW1lOworICAgIFVJTlQzMiAgICAgICAgIHYxICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MiAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjMgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY0ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2NSAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjYgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHY3ICAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2OCAgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjkgICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxMCAgID0gMDsgICAgCisgICAgVUlOVDMyICAgICAgICAgdjExICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxMiAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTMgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjE0ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxNSAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MTYgICA9IDA7CisgICAgVUlOVDMyICAgICAgICAgdjE3ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYxOCAgID0gMDsgCisgICAgVUlOVDMyICAgICAgICAgdjE5ICAgPSAwOworICAgIFVJTlQzMiAgICAgICAgIHYyMCAgID0gMDsKKyAgICBVSU5UMzIgICAgICAgICB2MjEgICA9IDA7ICAgCisgICAgVUxPTkcgICAgICAgICAgZmxhZ3MgPSAwOworICAgIE1WX1NUQVRVUyAgICAgIHJjICAgID0gIE1WX09LOworICAgIENQSF9GTE9XX0VOVFJZX1QgY3BoX2Zsb3c7CisKKyAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICAvKiBSZWFkIGlucHV0ICovCisgICAgc3NjYW5mKGJ1ZiwgIiVkICV4ICV4ICV4ICV4ICVkICVkICV4ICVkICVkICVkICV4ICVkICVkICV4ICVkICVkICVkICVkICVkICVkIiwgJnYxLCAmdjIsICZ2MywgJnY0LCAmdjUsICZ2NiwgJnY3LCAmdjgsICZ2OSwgJnYxMCwgJnYxMSwgJnYxMiwgJnYxMywgJnYxNCwgJnYxNSwgJnYxNiwgJnYxNywgJnYxOCwgJnYxOSwgJnYyMCwgJnYyMSk7CisKKyAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUgICAKKyAgICBpZiAoIXN0cmNtcChuYW1lLCAiYWRkX2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIG1lbXNldCgmY3BoX2Zsb3csIDAsIHNpemVvZihjcGhfZmxvdykpOworICAgICAgICBjcGhfZmxvdy5kaXIgICAgICAgPSAoQ1BIX0RJUl9FKXYxOworICAgICAgICBjcGhfZmxvdy5wYXJzZV9ibSAgPSAoQ1BIX0ZMT1dfUEFSU0VfRSl2MjsKKyAgICAgICAgY3BoX2Zsb3cubWggICAgICAgID0gKFVJTlQxNil2MzsKKyAgICAgICAgY3BoX2Zsb3cuZXRoX3R5cGUgID0gKFVJTlQxNil2NDsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjU7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY2OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kucGJpdHMgID0gKFVJTlQ4KXY3OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudHBpZCAgID0gKFVJTlQxNil2ODsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnZpZCAgICA9IChVSU5UMTYpdjk7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS5wYml0cyAgPSAoVUlOVDgpdjEwOworICAgICAgICBjcGhfZmxvdy5vcF90eXBlICAgICAgICAgICAgICAgID0gKENQSF9WTEFOX09QX1RZUEVfRSl2MTE7ICAgICAgICAKKyAgICAgICAgY3BoX2Zsb3cubW9kX291dGVyX3RjaS50cGlkICAgICA9IChVSU5UMTYpdjEyOworICAgICAgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnZpZCAgICAgID0gKFVJTlQxNil2MTM7CisgICAgICAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kucGJpdHMgICAgPSAoVUlOVDgpdjE0OworICAgICAgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnRwaWQgICAgID0gKFVJTlQxNil2MTU7CisgICAgICAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kudmlkICAgICAgPSAoVUlOVDE2KXYxNjsKKyAgICAgICAgY3BoX2Zsb3cubW9kX2lubmVyX3RjaS5wYml0cyAgICA9IChVSU5UOCl2MTc7CisgICAgICAgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19wb3J0ICAgICAgPSAoVUlOVDgpdjE4OworICAgICAgICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUgICAgID0gKFVJTlQ4KXYxOTsKKyAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9IChVSU5UOCl2MjA7ICAgICAgICAKKyAgICAgICAgY3BoX2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IChVSU5UMTYpdjIxOworICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZmxvd19hZGRfcnVsZSgmY3BoX2Zsb3cpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBhZGQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBhZGQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAKKyAgICB9ICAgCisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZGVsX2Zsb3dfcnVsZSIpKSB7CisgICAgICAgIG1lbXNldCgmY3BoX2Zsb3csIDAsIHNpemVvZihjcGhfZmxvdykpOworICAgICAgICBjcGhfZmxvdy5kaXIgICAgICAgPSAoQ1BIX0RJUl9FKXYxOworICAgICAgICBjcGhfZmxvdy5wYXJzZV9ibSAgPSAoQ1BIX0ZMT1dfUEFSU0VfRSl2MjsKKyAgICAgICAgY3BoX2Zsb3cubWggICAgICAgID0gKFVJTlQxNil2MzsKKyAgICAgICAgY3BoX2Zsb3cuZXRoX3R5cGUgID0gKFVJTlQxNil2NDsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnRwaWQgICA9IChVSU5UMTYpdjU7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS52aWQgICAgPSAoVUlOVDE2KXY2OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kucGJpdHMgID0gKFVJTlQ4KXY3OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudHBpZCAgID0gKFVJTlQxNil2ODsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnZpZCAgICA9IChVSU5UMTYpdjk7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS5wYml0cyAgPSAoVUlOVDgpdjEwOworICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZmxvd19kZWxfcnVsZSgmY3BoX2Zsb3cpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBkZWxldGUgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBkZWxldGUgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOworICAgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJnZXRfZmxvd19ydWxlIikpIHsKKyAgICAgICAgbWVtc2V0KCZjcGhfZmxvdywgMCwgc2l6ZW9mKGNwaF9mbG93KSk7CisgICAgICAgIGNwaF9mbG93LmRpciAgICAgICA9IChDUEhfRElSX0UpdjE7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2JtICA9IChDUEhfRkxPV19QQVJTRV9FKXYyOworICAgICAgICBjcGhfZmxvdy5taCAgICAgICAgPSAoVUlOVDE2KXYzOworICAgICAgICBjcGhfZmxvdy5ldGhfdHlwZSAgPSAoVUlOVDE2KXY0OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudHBpZCAgID0gKFVJTlQxNil2NTsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnZpZCAgICA9IChVSU5UMTYpdjY7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX291dGVyX3RjaS5wYml0cyAgPSAoVUlOVDgpdjc7CisgICAgICAgIGNwaF9mbG93LnBhcnNlX2lubmVyX3RjaS50cGlkICAgPSAoVUlOVDE2KXY4OworICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudmlkICAgID0gKFVJTlQxNil2OTsKKyAgICAgICAgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnBiaXRzICA9IChVSU5UOCl2MTA7CisgICAgICAgICAgICAKKyAgICAgICAgcmMgPSBjcGhfZmxvd19nZXRfcnVsZSgmY3BoX2Zsb3cpOworICAgICAgICBpZiAocmMgPT0gTVZfT0spIHsKKyAgICAgICAgICAgIHByaW50aygiU3VjY2VlZCB0byBnZXQgZmxvdyBydWxlXG4iKTsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiAgICAgICAgICAgICAgICAgICAgICAgIHxQYXJzZSBvdXRlciAgICAgICB8UGFyc2UgaW5uZXIgICAgICAgfE1vZCBvdXRlciAgICAgICAgIHxNb2QgSW5uZXIgICAgICAgICB8Rm9yd2FyZFxuIik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJkaXIgcGFyc2VfYm0gbWggICBldHkgICAgdHBpZCAgIHZpZCAgcGJpdHMgIHRwaWQgICB2aWQgIHBiaXRzICB0cGlkICAgdmlkICBwYml0cyAgdHBpZCAgIHZpZCAgcGJpdHMgIHBvcnQgcXVldWUgaHdmX3F1ZXVlIGdlbSAgb3BfdHlwZVxuIik7CisgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICAKKyAgICAgICAgICAgICAgICAgICAiJTIuMnMgIDB4JTA0eCAgICUtNGQgMHglMDR4IDB4JTA0eCAlNGQgJTFkICAgICAgMHglMDR4ICU0ZCAlMWQgICAgICAweCUwNHggJTRkICUxZCAgICAgIDB4JTA0eCAlNGQgJTFkICAgICAgJTFkICAgICUxZCAgICAgJTFkICAgICAgICAgJTRkICVzIFxuIiwKKyAgICAgICAgICAgICAgICAgICBjcGhfYXBwX2xvb2t1cF9kaXIoY3BoX2Zsb3cuZGlyKSwgY3BoX2Zsb3cucGFyc2VfYm0sIGNwaF9mbG93Lm1oLCBjcGhfZmxvdy5ldGhfdHlwZSwKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvdy5wYXJzZV9vdXRlcl90Y2kudHBpZCwgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnZpZCwgY3BoX2Zsb3cucGFyc2Vfb3V0ZXJfdGNpLnBiaXRzLCAKKyAgICAgICAgICAgICAgICAgICBjcGhfZmxvdy5wYXJzZV9pbm5lcl90Y2kudHBpZCwgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnZpZCwgY3BoX2Zsb3cucGFyc2VfaW5uZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93Lm1vZF9vdXRlcl90Y2kudHBpZCwgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnZpZCwgICBjcGhfZmxvdy5tb2Rfb3V0ZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93Lm1vZF9pbm5lcl90Y2kudHBpZCwgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnZpZCwgICBjcGhfZmxvdy5tb2RfaW5uZXJfdGNpLnBiaXRzLAorICAgICAgICAgICAgICAgICAgIGNwaF9mbG93LnBrdF9mcndkLnRyZ19wb3J0LCAgICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUsICBjcGhfZmxvdy5wa3RfZnJ3ZC50cmdfaHdmX3F1ZXVlLCBjcGhfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCwgCisgICAgICAgICAgICAgICAgICAgY3BoX2Zsb3dfbG9va3VwX29wX3R5cGUoY3BoX2Zsb3cub3BfdHlwZSkpOworICAgICAgICAgICAgIAorICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBnZXQgZmxvd1xuIik7CisgICAgICAgIH0KKyAgICB9ICAgCisgICAgZWxzZQorICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7CisjZW5kaWYKKworICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBjcGhfc3BlY19wcm9jX2RzY3Bfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0hBUiAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IENIQVIgICAgICAqbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKKyAgICBVSU5UMzIgICAgICAgICAgIHZbNjRdOworICAgIFVJTlQzMiAgICAgICAgICAgaW5kZXggPSAwOworICAgIFVMT05HICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgIE1WX1NUQVRVUyAgICAgICAgcmMgICAgPSAgTVZfT0s7ICAgICAKKyAgICBDUEhfRFNDUF9QQklUU19UIGRzY3BfbWFwOworCisgICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgLyogUmVhZCBpbnB1dCAqLworICAgIHNzY2FuZihidWYsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAiLAorICAgICAgICAgICAmdlswXSwgICZ2WzFdLCAgJnZbMl0sICAmdlszXSwgICZ2WzRdLCAgJnZbNV0sICAmdls2XSwgICZ2WzddLAorICAgICAgICAgICAmdls4XSwgICZ2WzldLCAgJnZbMTBdLCAmdlsxMV0sICZ2WzEyXSwgJnZbMTNdLCAmdlsxNF0sICZ2WzE1XSwKKyAgICAgICAgICAgJnZbMTZdLCAmdlsxN10sICZ2WzE4XSwgJnZbMTldLCAmdlsyMF0sICZ2WzIxXSwgJnZbMjJdLCAmdlsyM10sCisgICAgICAgICAgICZ2WzI0XSwgJnZbMjVdLCAmdlsyNl0sICZ2WzI3XSwgJnZbMjhdLCAmdlsyOV0sICZ2WzMwXSwgJnZbMzFdLAorICAgICAgICAgICAmdlszMl0sICZ2WzMzXSwgJnZbMzRdLCAmdlszNV0sICZ2WzM2XSwgJnZbMzddLCAmdlszOF0sICZ2WzM5XSwKKyAgICAgICAgICAgJnZbNDBdLCAmdls0MV0sICZ2WzQyXSwgJnZbNDNdLCAmdls0NF0sICZ2WzQ1XSwgJnZbNDZdLCAmdls0N10sCisgICAgICAgICAgICZ2WzQ4XSwgJnZbNDldLCAmdls1MF0sICZ2WzUxXSwgJnZbNTJdLCAmdls1M10sICZ2WzU0XSwgJnZbNTVdLAorICAgICAgICAgICAmdls1Nl0sICZ2WzU3XSwgJnZbNThdLCAmdls1OV0sICZ2WzYwXSwgJnZbNjFdLCAmdls2Ml0sICZ2WzYzXSk7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjQ7IGluZGV4KyspIHsKKyAgICAgICAgZHNjcF9tYXAucGJpdHNbaW5kZXhdID0gKFVJTlQ4KXZbaW5kZXhdOworICAgIH0KKyAgICBkc2NwX21hcC5pbl91c2UgPSAxOworCisgICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworICAgIGlmICghc3RyY21wKG5hbWUsICJzZXRfZHNjcF9tYXAiKSkgeyAgICAKKyAgICAgICAgcmMgPSBjcGhfZmxvd19zZXRfZHNjcF9tYXAoJmRzY3BfbWFwKTsKKyAgICAgICAgaWYgKHJjID09IE1WX09LKSB7CisgICAgICAgICAgICBwcmludGsoIlN1Y2NlZWQgdG8gc2V0IERTQ1AgdG8gUC1iaXRzIG1hcHBpbmdcbiIpOworICAgICAgICB9IAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50aygiRmFpbCB0byBzZXQgRFNDUCB0byBQLWJpdHMgbWFwcGluZ1xuIik7CisgICAgICAgIH0gICAgICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKKworICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKyAgICByZXR1cm4gbGVuOworfQorI2VuZGlmCisKK3N0YXRpYyBERVZJQ0VfQVRUUihoZWxwLCAgICAgICAgICAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoaGVscF9hZGQsICAgICAgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNob3dfYXBwX2RiLCAgICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzaG93X3BhcnNlX25hbWUsIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2hvd19tb2RfbmFtZSwgICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKHNob3dfZnJ3ZF9uYW1lLCAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFIAorc3RhdGljIERFVklDRV9BVFRSKHVkcF9wb3J0cywgICAgICAgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCitzdGF0aWMgREVWSUNFX0FUVFIoc2hvd19mbG93X3J1bGUsICBTX0lSVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGNsZWFyX2Zsb3dfcnVsZSwgU19JUlVTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfZHNjcF9tYXAsICAgIFNfSVJVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7CisjZW5kaWYKK3N0YXRpYyBERVZJQ0VfQVRUUihzZXRfY29tcGxleCwgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY18yX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzZXRfZmxhZywgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY18yX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGRfcGFyc2UsICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19uYW1lX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfcGFyc2UsICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGFkZF9tb2QsICAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX25hbWVfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9tb2QsICAgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWRkX2Zyd2QsICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfbmFtZV9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGVsX2Zyd2QsICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGRfYXBwX3J1bGUsICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKGRlbF9hcHBfcnVsZSwgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jX2FwcF9zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2FwcF9ydWxlLCBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfYXBwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnZXRfYXBwX3J1bGUsICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19hcHBfc3RvcmUpOworI2lmZGVmIENPTkZJR19NVl9DUEhfVURQX1NBTVBMRV9IQU5ETEUgCitzdGF0aWMgREVWSUNFX0FUVFIodWRwX3NyYywgICAgICAgICBTX0lXVVNSLCBjcGhfc3BlY19wcm9jX3Nob3csIGNwaF9zcGVjX3Byb2NfdWRwX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUih1ZHBfZHN0LCAgICAgICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY191ZHBfc3RvcmUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKK3N0YXRpYyBERVZJQ0VfQVRUUihhZGRfZmxvd19ydWxlLCAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19mbG93X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihkZWxfZmxvd19ydWxlLCAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19mbG93X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihnZXRfZmxvd19ydWxlLCAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19mbG93X3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzZXRfZHNjcF9tYXAsICAgIFNfSVdVU1IsIGNwaF9zcGVjX3Byb2Nfc2hvdywgY3BoX3NwZWNfcHJvY19kc2NwX3N0b3JlKTsKKyNlbmRpZgorc3RhdGljIERFVklDRV9BVFRSKHNldF90Y29udCwgICAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jXzJfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHRyYWNlX2xldmVsLCAgICAgU19JV1VTUiwgY3BoX3NwZWNfcHJvY19zaG93LCBjcGhfc3BlY19wcm9jXzFfc3RvcmUpOworCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjcGhfc3BlY19wcm9jX2F0dHJzW10gPSB7CisgICAgJmRldl9hdHRyX2hlbHAuYXR0ciwKKyAgICAmZGV2X2F0dHJfaGVscF9hZGQuYXR0ciwKKyAgICAmZGV2X2F0dHJfc2hvd19hcHBfZGIuYXR0ciwKKyAgICAmZGV2X2F0dHJfc2hvd19wYXJzZV9uYW1lLmF0dHIsCisgICAgJmRldl9hdHRyX3Nob3dfbW9kX25hbWUuYXR0ciwKKyAgICAmZGV2X2F0dHJfc2hvd19mcndkX25hbWUuYXR0ciwKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFICAgICAKKyAgICAmZGV2X2F0dHJfdWRwX3BvcnRzLmF0dHIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX0ZMT1dfTUFQX0hBTkRMRQorICAgICZkZXZfYXR0cl9zaG93X2Zsb3dfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9jbGVhcl9mbG93X3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfZGVsX2RzY3BfbWFwLmF0dHIsCisjZW5kaWYgICAgCisgICAgJmRldl9hdHRyX3NldF9jb21wbGV4LmF0dHIsCisgICAgJmRldl9hdHRyX3NldF9mbGFnLmF0dHIsCisgICAgJmRldl9hdHRyX2FkZF9wYXJzZS5hdHRyLAorICAgICZkZXZfYXR0cl9kZWxfcGFyc2UuYXR0ciwKKyAgICAmZGV2X2F0dHJfYWRkX21vZC5hdHRyLAorICAgICZkZXZfYXR0cl9kZWxfbW9kLmF0dHIsCisgICAgJmRldl9hdHRyX2FkZF9mcndkLmF0dHIsCisgICAgJmRldl9hdHRyX2RlbF9mcndkLmF0dHIsCisgICAgJmRldl9hdHRyX2FkZF9hcHBfcnVsZS5hdHRyLCAgICAKKyAgICAmZGV2X2F0dHJfZGVsX2FwcF9ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX3VwZGF0ZV9hcHBfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9nZXRfYXBwX3J1bGUuYXR0ciwKKyNpZmRlZiBDT05GSUdfTVZfQ1BIX1VEUF9TQU1QTEVfSEFORExFICAgICAgIAorICAgICZkZXZfYXR0cl91ZHBfc3JjLmF0dHIsCisgICAgJmRldl9hdHRyX3VkcF9kc3QuYXR0ciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NVl9DUEhfRkxPV19NQVBfSEFORExFCisgICAgJmRldl9hdHRyX2FkZF9mbG93X3J1bGUuYXR0ciwKKyAgICAmZGV2X2F0dHJfZGVsX2Zsb3dfcnVsZS5hdHRyLAorICAgICZkZXZfYXR0cl9nZXRfZmxvd19ydWxlLmF0dHIsCisgICAgJmRldl9hdHRyX3NldF9kc2NwX21hcC5hdHRyLAorI2VuZGlmCisgICAgJmRldl9hdHRyX3NldF90Y29udC5hdHRyLAorICAgICZkZXZfYXR0cl90cmFjZV9sZXZlbC5hdHRyLAorCisgICAgTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY3BoX3NwZWNfcHJvY19ncm91cCA9IHsKKyAgICAubmFtZSA9ICJwcm90byIsCisgICAgLmF0dHJzID0gY3BoX3NwZWNfcHJvY19hdHRycywKK307CisKK0lOVDMyIGNwaF9zeXNmc19pbml0KFZPSUQpCit7CisgICAgSU5UMzIgICAgICAgICAgZXJyID0gMDsKKyAgICBzdHJ1Y3QgZGV2aWNlICpwZCAgPSBOVUxMOworCisgICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjcGgiKTsKKyAgICBpZiAoIXBkKSB7CisgICAgICAgIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImNwaCIsIC0xLCBOVUxMLCAwKTsKKyAgICAgICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjcGgiKTsKKyAgICB9CisKKyAgICBpZiAoIXBkKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiIlczogY2Fubm90IGZpbmQgY3BoIGRldmljZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcGQgPSAmcGxhdGZvcm1fYnVzOworICAgIH0KKworICAgIGVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGQtPmtvYmosICZjcGhfc3BlY19wcm9jX2dyb3VwKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gInN5c2ZzIGdyb3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogSW5pdCBDUEggU1lTIEZTIGRhdGEgYmFzZSB0byBob2xkIHBhcnNlL21vZC9mcndkIHZhbHVlcyAqLworICAgIGNwaF9zeXNmc19pbml0X3BhcnNlX2RiKCk7CisgICAgY3BoX3N5c2ZzX2luaXRfbW9kX2RiKCk7ICAgIAorICAgIGNwaF9zeXNmc19pbml0X2Zyd2RfZGIoKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIj0gQ1VTVCBNb2R1bGUgU1lTIEZTIGluaXQgc3VjY2Vzc2Z1bGx5ID1cbiIpOworb3V0OgorICAgIHJldHVybiBlcnI7Cit9CisKK1ZPSUQgY3BoX3N5c2ZzX2V4aXQoVk9JRCkKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpwZCA9IE5VTEw7CisKKyAgICBwZCA9IGJ1c19maW5kX2RldmljZV9ieV9uYW1lKCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgImNwaCIpOworICAgIGlmICghcGQpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9FUlIiJXM6IGNhbm5vdCBmaW5kIENQSCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzeXNmc19yZW1vdmVfZ3JvdXAoJnBkLT5rb2JqLCAmY3BoX3NwZWNfcHJvY19ncm91cCk7CisKKyAgICBwcmludGsoS0VSTl9JTkZPICI9IENQSCBNb2R1bGUgU1lTIEZTIGV4aXQgc3VjY2Vzc2Z1bGx5ID1cbiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2NwaC9tdl9jcGhfc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODNhMTVkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jcGgvbXZfY3BoX3N5c2ZzLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgCittb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwgCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMgCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlIAorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvciAKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LiAKKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRCAKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkgCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5IAorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIAorbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4gCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCAKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgCisgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCisgICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgICAgCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgCitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIAorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiAKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgCitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIAorU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9jcGhfc3lzZnMuaAorKgorKiBERVNDUklQVElPTjogTWFydmVsbCBDUEgoQ1BIIFBhY2tldCBIYW5kbGVyKSBzeXNmcyBjb21tYW5kIGRlZmluaXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKiAgICAgICAgICAgICAgIE5vbmUKKyoKKyogQ1JFQVRFRCBCWTogICBWaWN0b3JHdQorKgorKiBEQVRFIENSRUFURUQ6IDExRGVjMjAxMQorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgICAgICAgICBSZXZpc2lvbjogMS4xCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfTVZfQ1BIX1NZU0ZTX0hfCisjZGVmaW5lIF9NVl9DUEhfU1lTRlNfSF8KKyAgICAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBDUEhfU1lTRlNfRklFTERfTUFYX0xFTiAgICgzMikKKyNkZWZpbmUgQ1BIX1NZU0ZTX0ZJRUxEX01BWF9FTlRSWSAoNjQpCisKKworLyogQ29tbW9uIERCIHN0cnVjdHVyZSBmb3IgZW50cmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgSU5UMzIgIG1heF9lbnRyeV9udW07CisgICAgSU5UMzIgIGVudHJ5X251bTsKKyAgICBJTlQzMiAgZW50cnlfc2l6ZTsKKyAgICBWT0lEICAqZW50cnlfYXJhOworfSBDUEhfU1lTRlNfUlVMRV9UOworCisvKiBQYXJzaW5nIGZpbGVkIGVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgbmFtZVtDUEhfU1lTRlNfRklFTERfTUFYX0xFTisxXTsKKyAgICBDUEhfQVBQX1BBUlNFX0ZJRUxEX0UgcGFyc2VfYm07CisgICAgQ1BIX0FQUF9QQVJTRV9UICAgICAgIHBhcnNlX2tleTsKK30gQ1BIX1NZU0ZTX1BBUlNFX1Q7CisKKy8qIE1vZGlmaWNhdGlvbiBmaWxlZCBlbnRyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQ0hBUiAgICAgICAgICAgICAgICAgIG5hbWVbQ1BIX1NZU0ZTX0ZJRUxEX01BWF9MRU4rMV07CisgICAgQ1BIX0FQUF9NT0RfRklFTERfRSAgIG1vZF9ibTsgCisgICAgQ1BIX0FQUF9NT0RfVCAgICAgICAgIG1vZF92YWx1ZTsKK30gQ1BIX1NZU0ZTX01PRF9UOworCisvKiBGb3J3YXJkaW5nIGZpbGVkIGVudHJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDSEFSICAgICAgICAgICAgICAgICAgbmFtZVtDUEhfU1lTRlNfRklFTERfTUFYX0xFTisxXTsKKyAgICBDUEhfQVBQX0ZSV0RfRklFTERfRSAgZnJ3ZF9ibTsKKyAgICBDUEhfQVBQX0ZSV0RfVCAgICAgICAgZnJ3ZF92YWx1ZTsKK30gQ1BIX1NZU0ZTX0ZSV0RfVDsKKworCitJTlQzMiBjcGhfc3lzZnNfaW5pdChWT0lEKTsKK1ZPSUQgY3BoX3N5c2ZzX2V4aXQoVk9JRCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTVZfQ1BIX1NZU0ZTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvS2NvbmZpZyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9LY29uZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxMmM2YTQyLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotbWVudSAiU29DIENVU1Qgc3VwcG9ydCIKLWRlcGVuZHMgb24gTVZfSU5DTFVERV9DVVNUCi0KLWNvbmZpZyAgTVZfQ1VTVAotICAgICAgICBib29sICJTdXBwb3J0IGZvciBNYXJ2ZWxsIEN1c3RvbWVyIERyaXZlciIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0KLQotY29uZmlnICBNVl9DVVNUX0lHTVBfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIElHTVAgaGFuZGxpbmciCi0gICAgICAgIGRlZmF1bHQgeQotICAgICAgICAtLS1oZWxwLS0tCi0KLWNvbmZpZyAgTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIE1MRCBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0KLQotY29uZmlnICBNVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBVTkkgbG9vcGJhY2sgZGV0ZWN0IGhhbmRsaW5nIgotICAgICAgICBkZWZhdWx0IHkKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAKLWNvbmZpZyAgTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgICAgICBib29sICJFbmFibGUgTVZfQ1VTVCBzYW1wbGUgVURQIGhhbmRsaW5nIgotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgLS0taGVscC0tLQotCi1jb25maWcgIE1WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgIGJvb2wgIkVuYWJsZSBNVl9DVVNUIGZsb3cgbWFwcGluZyBoYW5kbGluZyIKLSAgICAgICAgZGVmYXVsdCB5Ci0gICAgICAgIC0tLWhlbHAtLS0gICAgICAgIAotCi1lbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvTWFrZWZpbGUgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBmZDI4YjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIE1hcnZlbGwgQ3VzdG9tZXIgZHJpdmVyCi0jCi0KLWlmZXEgKCQoQ09ORklHX0FSQ0hfRkVST0NFT04pLHkpCi0JaW5jbHVkZSAkKHNyY3RyZWUpLyQoTUFDSElORSkvY29uZmlnL212UnVsZXMubWsKLWVuZGlmCi0KLWlmZGVmIENPTkZJR19NVl9IQUxfUlVMRVNfUEFUSAotaW5jbHVkZSAkKHNyY3RyZWUpL2luY2x1ZGUvY29uZmlnL2F1dG8uY29uZgotaW5jbHVkZSAkKHNyY3RyZWUpLyQoc3Vic3QgIiwsJChDT05GSUdfTVZfSEFMX1JVTEVTX1BBVEgpKQotZW5kaWYKLQotQ1VTVF9PQkpTICs9IAltdl9jdXN0X2Rldi5vIFwKLQkJbXZfY3VzdF9tb2QubyBcCi0JCW12X2N1c3RfZmxvd19tYXAubyBcCi0JCW12X2N1c3RfbmV0ZGV2Lm8gXAotCQltdl9jdXN0X3N5c2ZzLm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1tdl9jdXN0LW9ianMgOj0gJChDVVNUX09CSlMpCi1vYmotJChDT05GSUdfTVZfQ1VTVCkgKz0gbXZfY3VzdC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Rldi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDM5ZjkzYWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIAotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSogCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qIAotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfZGV2LmMKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgICAgIAotKiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotCi0jaW5jbHVkZSAibXZfY3VzdF9kZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X25ldGRldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfZmxvd19tYXAuaCIKLSNpbmNsdWRlICJtdl9jdXN0X21uZ19pZi5oIgotCi0KLS8qIFVzZWQgdG8gcHJldmVudCBtdWx0aXBsZSBhY2Nlc3MgdG8gZGV2aWNlICovCi1zdGF0aWMgaW50ICAgICAgICAgICAgICAgbXZjdXN0X2RldmljZV9vcGVuID0gMDsKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtdmN1c3RfbWlzY19kZXY7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12Y3VzdF9kZXZfb3BlbgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGV4ZWN1dGUgZGV2aWNlIG9wZW4gYWN0aW9ucwotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdmN1c3RfZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JTVZDVVNUX0RFQlVHX1BSSU5UKCJFbnRlciIpOwotCi0gICAvLyBpZiAobXZjdXN0X2RldmljZV9vcGVuID4gMCkKLSAgIC8vICAgICByZXR1cm4gLUVCVVNZOwotCi0JbXZjdXN0X2RldmljZV9vcGVuKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgbXZjdXN0X2Rldl9yZWxlYXNlCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZSBkZXZpY2UgcmVsZWFzZSBhY3Rpb25zCi0qKgotKiogIFBBUkFNRVRFUlM6ICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqCi0qKiAgT1VUUFVUUzogICAgIE5vbmUKLSoqCi0qKiAgUkVUVVJOUzogICAgICgwKQotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IG12Y3VzdF9kZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgIC8vIGlmIChtdmN1c3RfZGV2aWNlX29wZW4gPiAwKQotICAgLy8gICAgIG12Y3VzdF9kZXZpY2Vfb3Blbi0tOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogIG12X2N1c3RfZGV2X2lvY3RsCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZXhlY3V0ZSBJTyBjb21tYW5kcwotKioKLSoqICBQQVJBTUVURVJTOiAgc3RydWN0IGlub2RlICppbm9kZQotKiogICAgICAgICAgICAgICBzdHJ1Y3QgZmlsZSAqZmlscAotKiogICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kCi0qKiAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBtdmN1c3RfZGV2X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLSAgICBtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QgICAgICBjdXN0X29tY2lfc2V0OwotICAgIG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCAgICAgIGN1c3RfbGxpZF9zZXQ7Ci0gICAgbXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICAgICAgY3VzdF9mbG93X21hcDsKLSAgICBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwX3QgICAgICBjdXN0X2RzY3BfbWFwOwotICAgIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QgICAgIGN1c3RfYXBwX2V0eXBlOwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICByYzsKLQotICBpbnQgIHJldCA9IC1FSU5WQUw7Ci0KLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgc3dpdGNoKGNtZCkKLSAgewotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX09NQ0lfU0VUOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3Rfb21jaV9zZXQsIChtdl9jdXN0X2lvY3RsX29tY2lfc2V0X3QqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJjID0gbXZfY3VzdF9vbWNpX3NldChjdXN0X29tY2lfc2V0LnRjb250LCBjdXN0X29tY2lfc2V0LnR4cSwgY3VzdF9vbWNpX3NldC5nZW1wb3J0LCBjdXN0X29tY2lfc2V0LmtlZXBfcnhfbWgpOwotICAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIm12X2N1c3Rfb21jaV9zZXQgZmFpbGVkXG4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX09NQ0lfRU5BQkxFOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmVuYWJsZSwgKGludCAqKWFyZywgc2l6ZW9mKGludCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09NQ0ksIGVuYWJsZSk7Ci0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0VPQU1fRU5BQkxFOgotCi0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmVuYWJsZSwgKGludCAqKWFyZywgc2l6ZW9mKGludCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09BTSwgZW5hYmxlKTsKLSAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfRU9BTV9MTElEX1NFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9sbGlkX3NldCwgKGludCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIG12X2N1c3RfZW9hbV9sbGlkX3NldChjdXN0X2xsaWRfc2V0LmxsaWQsICYoY3VzdF9sbGlkX3NldC5sbGlkX21hY1swXSksIGN1c3RfbGxpZF9zZXQudHhxKTsKLSAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfTUFQX1JVTEVfU0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2Zsb3dfbWFwLCAobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvd19tYXApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1WX0NVU1RfSU9DVExfRFNDUF9NQVBfU0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2RzY3BfbWFwLCAobXZfY3VzdF9pb2N0bF9kc2NwX21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9kc2NwX21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9kc2NwX21hcF9zZXQoJmN1c3RfZHNjcF9tYXAuZHNjcF9tYXApOwotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0RFTDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfbWFwX3J1bGVfZGVsKCh1aW50MTZfdCljdXN0X2Zsb3dfbWFwLnZpZCwgKHVpbnQ4X3QpY3VzdF9mbG93X21hcC5wYml0cywgY3VzdF9mbG93X21hcC5kaXIpOwotICAgICAgICAgIGJyZWFrOyAKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0RTQ1BfTUFQX0RFTDoKLQotICAgICAgICAgIHJldCA9IG12X2N1c3RfZHNjcF9tYXBfZGVsKCk7Ci0gICAgICAgICAgYnJlYWs7IAotICAgICAgICAgIAotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0NMRUFSOgotICAgICAgCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF9tYXBfcnVsZV9jbGVhcigpOwotICAgICAgICAgIGJyZWFrOyAKLSAgICAgICAgICAKLSAgICAgIGNhc2UgTVZfQ1VTVF9JT0NUTF9UQUdfTUFQX1JVTEVfR0VUOgotICAgICAgICAgIGlmKGNvcHlfZnJvbV91c2VyKCZjdXN0X2Zsb3dfbWFwLCAobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICopYXJnLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgiY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfQotICAgICAgCi0gICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3dfbWFwKTsKLQotICAgICAgICAgIGlmKHJldCAhPSBNVl9DVVNUX09LKQotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLQotICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KilhcmcsICZjdXN0X2Zsb3dfbWFwLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX1VOVEFHX01BUF9SVUxFX0dFVDoKLSAgICAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmY3VzdF9mbG93X21hcCwgKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoImNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGlvY3RsRXJyOwotICAgICAgICAgIH0KLSAgICAgIAotICAgICAgICAgIHJldCA9IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3dfbWFwKTsKLQotICAgICAgICAgIGlmKHJldCAhPSBNVl9DVVNUX09LKQotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLQotICAgICAgICAgIGlmKGNvcHlfdG9fdXNlcigobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KilhcmcsICZjdXN0X2Zsb3dfbWFwLCBzaXplb2YobXZfY3VzdF9pb2N0bF9mbG93X21hcF90KSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKLSAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7Ci0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBNVl9DVVNUX0lPQ1RMX0FQUF9FVEhfVFlQRV9TRVQ6Ci0gICAgICAgICAgaWYoY29weV9mcm9tX3VzZXIoJmN1c3RfYXBwX2V0eXBlLCAobXZfY3VzdF9pb2N0bF9hcHBfZXR5cGVfdCAqKWFyZywgc2l6ZW9mKG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgZ290byBpb2N0bEVycjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtdl9jdXN0X2FwcF9ldHlwZV9zZXQoY3VzdF9hcHBfZXR5cGUuYXBwX3R5cGUsIGN1c3RfYXBwX2V0eXBlLmV0aF90eXBlKTtcCi0gICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICBicmVhazsgCi0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0ID0gLUVJTlZBTDsKLSAgfQotCi1pb2N0bEVycjoKLSAgICByZXR1cm4ocmV0KTsKLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtdmN1c3RfZGV2X2ZvcHMgPSAKLXsKLQkub3BlbiAgICA9IG12Y3VzdF9kZXZfb3BlbiwKLQkucmVsZWFzZSA9IG12Y3VzdF9kZXZfcmVsZWFzZSwKLQkuaW9jdGwgICA9IG12Y3VzdF9kZXZfaW9jdGwsCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICBtdmN1c3RfZGV2X2luaXQKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgREVTQ1JJUFRJT046IAotKioKLSoqICBQQVJBTUVURVJTOiAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqICAgICAgICAgICAgICAgCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICAoMCkKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBtdmN1c3RfZGV2X2luaXQodm9pZCkKLXsKLSAgICBpbnQgcmM7Ci0KLSAgICBNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0gICAgCi0gICAgbXZjdXN0X21pc2NfZGV2Lm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SOwotICAgIG12Y3VzdF9taXNjX2Rldi5uYW1lICA9IE1WQ1VTVF9ERVZJQ0VfTkFNRTsKLSAgICBtdmN1c3RfbWlzY19kZXYuZm9wcyAgPSAmbXZjdXN0X2Rldl9mb3BzOwotCi0gICAgcmMgPSBtaXNjX3JlZ2lzdGVyKCZtdmN1c3RfbWlzY19kZXYpOwotICAgIGlmIChyYyAhPSAwKSAKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoInJjPSVkIixyYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IG12Y3VzdF9uZXRkZXZfaW5pdCgpOwotICAgIGlmIChyYyAhPSAwKSAKLSAgICB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoInJjPSVkIixyYyk7Ci0gICAgICAgIHJldHVybiByYzsKLSAgICB9Ci0KLSAgICByYyA9IG12Y3VzdF9zeXNmc19pbml0KCk7Ci0gICAgaWYgKHJjICE9IDApIAotICAgIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVCgicmM9JWQiLHJjKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIHByaW50aygiTVZDVVNUOiBtaXNjIGRldmljZSAlcyByZWdpc3RlcmVkIHdpdGggbWlub3I6ICVkXG4iLCBNVkNVU1RfREVWSUNFX05BTUUsIG12Y3VzdF9taXNjX2Rldi5taW5vcik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgbXZjdXN0X2Rldl9zaHV0ZG93bgotKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogCi0qKgotKiogIFBBUkFNRVRFUlM6ICAKLSoqICAgICAgICAgICAgICAgCi0qKiAgICAgICAgICAgICAgIAotKiogICAgICAgICAgICAgICAKLSoqCi0qKiAgT1VUUFVUUzogICAgIE5vbmUKLSoqCi0qKiAgUkVUVVJOUzogICAgICgwKQotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG12Y3VzdF9kZXZfc2h1dGRvd24odm9pZCkKLXsKLQlNVkNVU1RfREVCVUdfUFJJTlQoIkVudGVyIik7Ci0KLSAgICBtdmN1c3Rfc3lzZnNfZGVsZXRlKCk7Ci0KLSAgICBtaXNjX2RlcmVnaXN0ZXIoJm12Y3VzdF9taXNjX2Rldik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZGV2LmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9kZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQyNTAzYy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9kZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfZGV2LmgKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fTVZfQ1VTVF9ERVZfSF9fCi0jZGVmaW5lIF9fTVZfQ1VTVF9ERVZfSF9fCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLSNkZWZpbmUgTVZfQ1VTVF9WRVJTSU9OICAgICAiVjIuNi4yNSIKLSNkZWZpbmUgTVZDVVNUX0RFVklDRV9OQU1FICAiY3VzdCIKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9NQUdJQyAoJ0MnKQotCi0jaWZkZWYgTVZfQ1VTVF9ERUJVRwotI2RlZmluZSBNVkNVU1RfREVCVUdfUFJJTlQoZm9ybWF0LCAuLi4pICAgcHJpbnRrKCIlcyglZCk6ICAiZm9ybWF0LF9fRlVOQ1RJT05fXyxfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXykKLSNlbHNlCi0jZGVmaW5lIE1WQ1VTVF9ERUJVR19QUklOVChmb3JtYXQsIC4uLikKLSNlbmRpZgotCi0jZGVmaW5lIE1WQ1VTVF9FUlJfUFJJTlQoZm9ybWF0LCAuLi4pICAgICBwcmludGsoIiVzKCVkKSBFUlJPUjogICJmb3JtYXQsX19GVU5DVElPTl9fLF9fTElORV9fLCAjI19fVkFfQVJHU19fKQotCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIHBsYXRmb3JtX2J1c190eXBlOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiBwcm90b3R5cGVzIC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50MzJfdCBtdmN1c3RfZGV2X2luaXQgICAgICAgICh2b2lkKTsKLXZvaWQgICAgbXZjdXN0X2Rldl9zaHV0ZG93biAgICAodm9pZCk7Ci0KLWludCAgICAgbXZjdXN0X25ldGRldl9pbml0ICAgICAodm9pZCk7Ci1pbnQgICAgIG12Y3VzdF9zeXNmc19pbml0ICAgICAgKHZvaWQpOwotdm9pZCAgICBtdmN1c3Rfc3lzZnNfZGVsZXRlICAgICh2b2lkKTsKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi12b2lkICAgIG12X2N1c3RfdWRwX3NwZWNfcHJpbnRfYWxsICh2b2lkKTsKLSNlbmRpZgotdm9pZCAgICBtdl9jdXN0X2RlYnVnX2luZm9fc2V0ICAgICAoaW50IHZhbCk7Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLXZvaWQgbXZfY3VzdF9mbG93X21hcF9wcmludCh2b2lkKTsKLQotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qX19NVl9DVVNUX0RFVl9IX18qLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDk3NzMzZTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qCi0qIFRoaXMgaXMgVU5QVUJMSVNIRUQgUFJPUFJJRVRBUlkgU09VUkNFIENPREUgb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwOwotKiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBub3QgYmUgZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMsIGNvcGllZAotKiBvciBkdXBsaWNhdGVkIGluIGFueSBmb3JtLCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB3aXRob3V0IHRoZSBwcmlvcgotKiB3cml0dGVuIHBlcm1pc3Npb24gb2YgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qCi0qIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQotKiBESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5Ci0qIGRpc2NsYWltZXIuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZfY3VzdF9mbG93X21hcC5jCi0qCi0qIERFU0NSSVBUSU9OOgotKiAgIFZpY3RvciAgLSBpbml0aWFsIHZlcnNpb24gY3JlYXRlZC4gICAxMi9EZWMvMjAxMSAKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bXZDb21tb24uaD4KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxuZXQvaXB2Ni5oPgotCi0jaW5jbHVkZSA8bXZPcy5oPgotI2luY2x1ZGUgPGN0cmxFbnYvbXZDdHJsRW52TGliLmg+Ci0KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfbmV0ZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9mbG93X21hcC5oIgotI2luY2x1ZGUgIm12X2N1c3RfbW5nX2lmLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsIERhdGEgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgbXZfY3VzdF92aWRfaW5kZXhfdCAgZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfTlVNXTsKLXN0YXRpYyBtdl9jdXN0X3BiaXRzX21hcF90ICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9OVU1dW01WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFXTsKLXN0YXRpYyBtdl9jdXN0X2RzY3BfcGJpdHNfdCBnc19kc2NwX21hcF90YWJsZTsKLQotc3RhdGljIHVpbnQzMl90IGdzX212X2N1c3RfdHJhY2VfZmxhZyA9IDA7Ci0KLS8qIERlZmluZWQgdG8gc3VwcG9ydCBULUNPTlQgc3RhdGUgKi8KLXN0YXRpYyBib29sIGdzX3Rjb250X3N0YXRlW0NQSF9NQVhfVENPTlRfTlVNXTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIERlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9zZXRfdHJhY2VfZmxhZwotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIG12X2N1c3QgdHJhY2UgZmxhZy4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGVuVHJhY2UgICAgIC0gRW5hYmxlIG9yIGRpc2FibGUgbXZfY3VzdCB0cmFjZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcodWludDMyX3QgZW5UcmFjZSkKLXsKLSAgICBnc19tdl9jdXN0X3RyYWNlX2ZsYWcgPSBlblRyYWNlOwotICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdmFsaWRfcGJpdHNfdGFibGVfZ2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGdldHMgYXZhaWxhYmxlIFAtYml0cyBtYXBwaW5nIHRhYmxlLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIEF2YWlsYWJsZSBQLWJpdHMgbWFwcGluZyB0YWJsZSBpbmRleC4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotdWludDMyX3QgbXZfY3VzdF92YWxpZF9wYml0c190YWJsZV9nZXQobXZfY3VzdF9mbG93X2Rpcl9lIGRpcikKLXsKLSAgICB1aW50MzJfdCB0YWJsZV9pZHggPSAwOwotCi0gICAgLyogVGFibGUgaW5kZXggTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUgaXMgcmVzZXJ2ZWQgZm9yIHRhZ2dlZCBkZWZhdWx0IHBhY2tldHMgKi8KLSAgICBmb3IgKHRhYmxlX2lkeD0wOyB0YWJsZV9pZHg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUtMTsgdGFibGVfaWR4KyspIHsKLSAgICAKLSAgICAgICBpZiAoZ3NfcGJpdHNfbWFwX3RhYmxlW2Rpcl1bdGFibGVfaWR4XS5pbl91c2UgPT0gMCkKLSAgICAgICAgICAgcmV0dXJuIHRhYmxlX2lkeDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBQLWJpdHMgbWFwcGluZyB0YWJsZSBzdGF0dXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBwYml0c19tYXAgICAtIFAtYml0cyBtYXBwaW5nIHRhYmxlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgMDpObyBQLWJpdHMgbWFwcGluZyBydWxlIGV4aXN0IGluIGN1cnJlbnQgdGFibGUsIDE6IHN0aWxsIGV4aXN0cyBQLWJpdHMgbWFwcGluZyBydWxlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi11aW50MzJfdCBtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQobXZfY3VzdF9wYml0c19tYXBfdCAqcGJpdHNfbWFwKQotewotICAgIHVpbnQzMl90IHBiaXRzX2lkeCA9IDA7Ci0KLSAgICBmb3IgKHBiaXRzX2lkeD0wOyBwYml0c19pZHg8TVZfQ1VTVF9QQklUU19NQVBfTUFYX0VOVFJZX05VTTsgcGJpdHNfaWR4KyspIHsKLSAgICAKLSAgICAgICBpZiAocGJpdHNfbWFwLT5wa3RfZndkW3BiaXRzX2lkeF0uaW5fdXNlICE9IDApCi0gICAgICAgICAgIHJldHVybiBNVl9DVVNUX09LOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfc2V0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgLSBWTEFOIElELCA4MDIuMXAgdmFsdWUsIHBrdF9md2QgaW5mb3JtYXRpb24uCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3J1bGVfc2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KQotewotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICpwVmlkRW50cnkgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BiaXRzX21hcF90ICAqcFBiaXRzTWFwICA9IE5VTEw7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHBiaXRzSW5kZXggPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBpbmRleCAgICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgdmlkICAgICAgICA9IDA7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHBiaXRzICAgICAgPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBtb2RfdmlkICAgID0gMDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgbW9kX3BiaXRzICA9IDA7ICAgCi0gICAgbXZfY3VzdF9mbG93X2Rpcl9lICAgIGRpciAgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOyAgICAKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgICAqcGt0X2Z3ZCAgICA9IE5VTEw7Ci0KLSAgICAvKiBHZXQgaW5wdXQgaW5mb3JtYXRpb246IFZJRCwgUC1iaXRzLi4uICovCi0gICAgaWYgKGN1c3RfZmxvdyA9PSBOVUxMKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImN1c3RfZmxvdyBpcyBOVUxMIFxuXHIiKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9IAotICAgIHZpZCAgICAgICA9ICBjdXN0X2Zsb3ctPnZpZDsKLSAgICBwYml0cyAgICAgPSAgY3VzdF9mbG93LT5wYml0czsKLSAgICBtb2RfdmlkICAgPSAgY3VzdF9mbG93LT5tb2RfdmlkOwotICAgIG1vZF9wYml0cyA9ICBjdXN0X2Zsb3ctPm1vZF9wYml0czsgICAgCi0gICAgcGt0X2Z3ZCAgID0gJmN1c3RfZmxvdy0+cGt0X2Zyd2Q7Ci0gICAgZGlyICAgICAgID0gIGN1c3RfZmxvdy0+ZGlyOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PSVzOiB2aWRbJWRdLCBwYml0c1slZF0sIG1vZF92aWRbJWRdLCBtb2RfcGJpdHNbJWRdLCBULUNPTlRbJWRdLCBTV0YgcXVldWVbJWRdLCBIV0YgcXVldWVbJWRdLCBHRU0gcG9ydFslZF0sIGRpclslZF1cblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZpZCwgcGJpdHMsIG1vZF92aWQsIG1vZF9wYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT50cmdfcG9ydDowKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBrdF9md2QhPSBOVUxMKT8gcGt0X2Z3ZC0+dHJnX3F1ZXVlOjApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT50cmdfaHdmX3F1ZXVlOjApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocGt0X2Z3ZCE9IE5VTEwpPyBwa3RfZndkLT5nZW1fcG9ydDowKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+ZGlyKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBWSUQgKi8KLSAgICBpZiAodmlkID4gKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCB2aWQsIChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgUC1iaXRzICovCi0gICAgaWYgKHBiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJQLWJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBiaXRzLCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBtb2QgVklEICovCi0gICAgaWYgKG1vZF92aWQgPiAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJtb2RfdmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBtb2RfdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIG1vZCBQLWJpdHMgKi8KLSAgICBpZiAobW9kX3BiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJtb2RfcGJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIG1vZF9wYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZGlyICovCi0gICAgaWYgKGRpciA+PSBNVl9DVVNUX0ZMT1dfRElSX05VTSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJkaXJbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIGRpciwgTVZfQ1VTVF9GTE9XX0RJUl9OVU0tMSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgICAKLQotICAgIC8qIENoZWNrIHRhcmdldCBwb3J0L3F1ZXVlL0dFTSBwb3J0ICovIAotICAgIGlmIChwa3RfZndkLT50cmdfcG9ydCA+IE1WX0NVU1RfTUFYX1RSR19QT1JUX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInRyZ19wb3J0WyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwa3RfZndkLT50cmdfcG9ydCwgTVZfQ1VTVF9NQVhfVFJHX1BPUlRfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIGlmIChwa3RfZndkLT50cmdfcXVldWUgPiBNVl9DVVNUX01BWF9UUkdfUVVFVUVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiU1dGIHRyZ19xdWV1ZVslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgcGt0X2Z3ZC0+dHJnX3F1ZXVlLCBNVl9DVVNUX01BWF9UUkdfUVVFVUVfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAKLQotICAgIGlmIChwa3RfZndkLT50cmdfaHdmX3F1ZXVlID4gTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgIkhXRiB0cmdfcXVldWVbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBrdF9md2QtPnRyZ19xdWV1ZSwgTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgICAgIAotCi0gICAgaWYgKHBrdF9md2QtPmdlbV9wb3J0ID4gTVZfQ1VTVF9NQVhfR0VNX1BPUlRfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidHJnX3F1ZXVlWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwa3RfZndkLT5nZW1fcG9ydCwgTVZfQ1VTVF9NQVhfR0VNX1BPUlRfVkFMVUUpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0gICAgICAgICAgCi0gCi0gICAgCi0gICAgLyogRmluZCBWSUQgaW5kZXggZW50cnkgYnkgVklEICovICAgIAotICAgIHBWaWRFbnRyeSA9ICZnc192aWRfaW5kZXhfdGFibGVbZGlyXS5wYml0c19tYXBfaW5kZXhbdmlkXTsKLQotICAgIC8qIEdldCBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIC8qIElmIHRoaXMgVklEIGluZGV4IGVudHJ5IGRvZXMgbm90IHBvaW50IHRvIGFueSBQLWJpdHMgbWFwcGluZyB0YWJsZSwKLSAgICAgICBuZWVkIHRvIHNlYXJjaCBmb3IgYW4gYXZhaWxhYmxlIFAtYml0cyBtYXBwaW5nIHRhYmxlICAgICAgICAgICAgICovCi0gICAgaWYgKCpwVmlkRW50cnkgPj0gTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpIHsKLSAgICAgICAgLyogUmVzZXJ2ZWQgZm9yIGRlZmF1bHQgdGFnZ2VkIHJ1bGUgKi8KLSAgICAgICAgaWYgKHZpZCA9PSBNVl9DVVNUX0RFRkFVTFRfU0lOR0xFX1RBR19SVUxFKQotICAgICAgICAgICAgcGJpdHNJbmRleCA9IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFIC0gMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGJpdHNJbmRleCA9IG12X2N1c3RfdmFsaWRfcGJpdHNfdGFibGVfZ2V0KGRpcik7Ci0gICAgICAgIAotICAgICAgICBpZiAocGJpdHNJbmRleCA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiICVkIFAtYml0cyBtYXBwaW5nIHRhYmxlIGhhcyB1c2VkIG91dFxuXHIiLCBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVgpOwotICAgICAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsgICAgIAotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgfQotICAgIC8qIEluIGNhc2UgdGhhdCB0aGUgVklEIGluZGV4IGFscmVhZHkgcG9pbnRzIHRvIGEgUC1iaXRzIG1hcHBpbmcgdGFibGUsCi0gICAgICAgTmVlZCB0byByZXBsYWNlIHRoZSBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIG9mIHRoaXMgUC1iaXQgbWFwcGluZyB0YWJsZSAqLwotICAgIGVsc2UgewotICAgICAgICBwYml0c0luZGV4ID0gKnBWaWRFbnRyeTsKLSAgICB9Ci0gICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdW3BiaXRzSW5kZXhdOwotCi0gICAgLyogSWYgbGVnYWwgUC1iaXRzIGlzIGNvbmZpZ3VyZWQgKi8KLSAgICBpZiAocGJpdHMgPCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSB7Ci0gICAgICAgIC8qIEluIGNhc2UgdG8gZW5hYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGlmIChwa3RfZndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAKLSAgICAgICAgICAgIC8qIFNhdmUgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLyAgICAgICAgCi0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgICAgPSBwa3RfZndkLT50cmdfcG9ydDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX3F1ZXVlICAgICA9IHBrdF9md2QtPnRyZ19xdWV1ZTsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX2h3Zl9xdWV1ZSA9IHBrdF9md2QtPnRyZ19od2ZfcXVldWU7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmdlbV9wb3J0ICAgICAgPSBwa3RfZndkLT5nZW1fcG9ydDsKLQotICAgICAgICAgICAgLyogU2F2ZSBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW3BiaXRzXSAgICAgICAgICAgPSBtb2RfdmlkOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgPSBtb2RfcGJpdHM7Ci0KLSAgICAgICAgICAgIC8qIEVuYWJsZSBpbl91c2UgZmxhZyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5pbl91c2UgICAgPSAxOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICAgICAgPSAxOwotCi0gICAgICAgICAgICAvKiBTYXZlIFAtYml0IG1hcHBpbmcgdGFibGUgaW5kZXggaW4gVklEIGluZGV4IHRhYmxlICovCi0gICAgICAgICAgICAqcFZpZEVudHJ5ID0gcGJpdHNJbmRleDsgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgLyogSW4gY2FzZSB0byBkaXNhYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogQ2xlYXIgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiAqLyAgICAgICAgCi0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS50cmdfcXVldWUgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX2h3Zl9xdWV1ZSA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmdlbV9wb3J0ICAgICAgPSAwOwotCi0gICAgICAgICAgICAvKiBDbGVhciBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW3BiaXRzXSAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgPSAwOyAgICAgICAgICAKLQotICAgICAgICAgICAgLyogRGlzYWJsZSBpbl91c2UgZmxhZyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5pbl91c2UgICAgPSAwOwotICAgICAgICAgICAgaWYgKG12X2N1c3RfcGJpdHNfdGFibGVfc3RhdHVzX2dldChwUGJpdHNNYXApICE9IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgID0gTVZfQ1VTVF9JTlZBTElEX1BCSVRTX1RBQkxFX0lOREVYOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgICAgICAgICAgICAgICAgICAgICA9IHBiaXRzSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgZG9lcyBub3QgY2FyZSBmb3IgUC1iaXRzLCBlYWNoIFAtYml0cyBtYXBwaW5nIGVudHJ5IHNob3VsZCBiZSBzZXQgKi8KLSAgICBlbHNlIGlmIChwYml0cyA9PSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKSB7Ci0KLSAgICAgICAgaW5kZXggPSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFOwotCi0gICAgICAgIC8qIEluIGNhc2UgdG8gZW5hYmxlIHBhY2tldCBmb3J3YXJkaW5nICovCi0gICAgICAgIGlmIChwa3RfZndkLT5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXZlIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS50cmdfcG9ydCAgICAgID0gcGt0X2Z3ZC0+dHJnX3BvcnQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLnRyZ19xdWV1ZSAgICAgPSBwa3RfZndkLT50cmdfcXVldWU7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSBwa3RfZndkLT50cmdfaHdmX3F1ZXVlOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS5nZW1fcG9ydCAgICAgID0gcGt0X2Z3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbaW5kZXhdLmluX3VzZSAgICAgICAgPSAxOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBTYXZlIG1vZF92aWQgbW9kX3BiaXRzICovCi0gICAgICAgICAgICBwUGJpdHNNYXAtPm1vZF92aWRbaW5kZXhdICAgICAgICAgICA9IG1vZF92aWQ7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF0gICAgICAgICA9IG1vZF9wYml0czsgICAgICAgICAgIAotCi0gICAgICAgICAgICAvKiBFbmFibGUgaW5fdXNlIGZsYWcgKi8KLSAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlID0gMTsKLQotICAgICAgICAgICAgLyogU2F2ZSBQLWJpdCBtYXBwaW5nIHRhYmxlIGluZGV4IGluIFZJRCBpbmRleCB0YWJsZSAqLwotICAgICAgICAgICAgKnBWaWRFbnRyeSA9IHBiaXRzSW5kZXg7ICAgICAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIC8qIEluIGNhc2UgdG8gZGlzYWJsZSBwYWNrZXQgZm9yd2FyZGluZyAqLwotICAgICAgICBlbHNlIHsgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIENsZWFyIGZvcndhcmRpbmcgaW5mb3JtYXRpb24gKi8gICAgICAgIAotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS50cmdfcG9ydCAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0udHJnX3F1ZXVlICAgICA9IDA7Ci0gICAgICAgICAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19od2ZfcXVldWUgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XS5nZW1fcG9ydCAgICAgID0gMDsKLSAgICAgICAgICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF0uaW5fdXNlICAgICAgICA9IDA7Ci0gICAgICAgICAgICAvKiBjbGVhciBtb2RfdmlkIG1vZF9wYml0cyAqLwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfdmlkW2luZGV4XSAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbaW5kZXhdICAgICAgICAgPSAwOwotCi0gICAgICAgICAgICAvKiBEaXNhYmxlIGluX3VzZSBmbGFnICovCi0gICAgICAgICAgICBpZiAobXZfY3VzdF9wYml0c190YWJsZV9zdGF0dXNfZ2V0KHBQYml0c01hcCkgIT0gTVZfQ1VTVF9PSykgewotICAgICAgICAgICAgICAgIHBQYml0c01hcC0+aW5fdXNlICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgICpwVmlkRW50cnkgICAgICAgICAgICAgICAgICAgICAgPSBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwUGJpdHNNYXAtPmluX3VzZSAgICAgICAgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgID0gcGJpdHNJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RVhJVD09ICVzOlxuXHIiLF9fRlVOQ1RJT05fXyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7ICAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9zZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBHUE9OIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIGRzY3BfbWFwICAgICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfZHNjcF9tYXBfc2V0KG12X2N1c3RfZHNjcF9wYml0c190ICpkc2NwX21hcCkKLXsKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09JXM6IGluX3VzZVslZF1cblxyIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkc2NwX21hcCE9IE5VTEwpPyBkc2NwX21hcC0+aW5fdXNlOjApKTsKLSAgICB9Ci0KLSAgICBpZiAoZHNjcF9tYXAgPT0gTlVMTCkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJJbnB1dCBkc2NwX21hcCBpcyBOVUxMXG5cciIpOwotICAgICAgICByZXR1cm4gTVZfQ1VTVF9GQUlMOwotICAgIH0KLQotICAgIC8qIENhc2UgMTogdG8gZW5hYmxlIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgKi8KLSAgICBpZiAoZHNjcF9tYXAtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgIG1lbWNweSgmZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbMF0sICZkc2NwX21hcC0+cGJpdHNbMF0sIHNpemVvZihnc19kc2NwX21hcF90YWJsZS5wYml0cykpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAxOwotICAgIAotICAgIH0KLSAgICAvKiBDYXNlIDI6IHRvIGRpc2FibGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLwotICAgIGVsc2UgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihnc19kc2NwX21hcF90YWJsZSkpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT0gJXM6XG5cciIsX19GVU5DVElPTl9fKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7ICAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfcnVsZV9kZWwKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGVsZXRlcyBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgdmlkICAgICAgICAgLSBWTEFOIElELgotKiogICAgICBwYml0cyAgICAgIC0gODAyLjFwIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUgCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfbWFwX3J1bGVfZGVsKHVpbnQxNl90IHZpZCwgdWludDhfdCBwYml0cywgbXZfY3VzdF9mbG93X2Rpcl9lIGRpcikKLXsKLSAgICB1aW50OF90ICAgICAgICAgICAgICAqcFZpZEVudHJ5ICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wYml0c19tYXBfdCAgKnBQYml0c01hcCAgPSBOVUxMOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PTogdmlkWyVkXSxwYml0c1slZF1cblxyIiwgdmlkLCBwYml0cyk7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgVklEICovCi0gICAgaWYgKHZpZCA+IChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgInZpZFslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgdmlkLCAoTVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkUgLSAxKSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotICAgIAotICAgIC8qIENoZWNrIFAtYml0cyAqLwotICAgIGlmIChwYml0cyA+IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUUpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAiUC1iaXRzWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCBwYml0cywgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZGlyICovCi0gICAgaWYgKGRpciA+PSBNVl9DVVNUX0ZMT1dfRElSX05VTSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJkaXJbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIGRpciwgTVZfQ1VTVF9GTE9XX0RJUl9OVU0tMSk7Ci0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgfSAgIAotCi0gICAgLyogRmluZCBWSUQgaW5kZXggZW50cnkgYnkgVklEICovICAgIAotICAgIHBWaWRFbnRyeSA9ICZnc192aWRfaW5kZXhfdGFibGVbZGlyXS5wYml0c19tYXBfaW5kZXhbdmlkXTsKLQotICAgIGlmICgqcFZpZEVudHJ5ID49IE1WX0NVU1RfTUFYX1BCSVRTX01BUF9UQUJMRV9TSVpFKSB7Ci0gICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLCIlcywgcFZpZEVudHJ5WyVkXSwgZG9lcyBub3QgbmVlZCB0byBkZWxldGUgXG5cciIsX19GVU5DVElPTl9fLCAqcFZpZEVudHJ5KTsgICAgCi0gICAgICAgIHJldHVybiBNVl9DVVNUX09LOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0KLSAgICAvKiBGaW5kIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCi0gICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdWypwVmlkRW50cnldOwotCi0gICAgLyogRGVsZXRlIFAtYml0cyBtYXBwaW5nIHJ1bGUgKi8KLSAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLnRyZ19wb3J0ICAgPSAwOwotICAgIHBQYml0c01hcC0+cGt0X2Z3ZFtwYml0c10udHJnX3F1ZXVlICA9IDA7Ci0gICAgcFBiaXRzTWFwLT5wa3RfZndkW3BiaXRzXS5nZW1fcG9ydCAgID0gMDsKLSAgICBwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNdLmluX3VzZSAgICAgPSAwOwotICAgIHBQYml0c01hcC0+bW9kX3ZpZFtwYml0c10gICAgICAgICAgICA9IDA7Ci0gICAgcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNdICAgICAgICAgID0gMDsgICAgICAgICAgCi0gICAgCi0gICAgLyogRGlzYWJsZSBpbl91c2UgZmxhZyAqLwotICAgIGlmIChtdl9jdXN0X3BiaXRzX3RhYmxlX3N0YXR1c19nZXQocFBiaXRzTWFwKSE9IE1WX0NVU1RfT0spIHsKLSAgICAgICAgcFBiaXRzTWFwLT5pbl91c2UgICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAqcFZpZEVudHJ5ICAgICAgICAgICAgICAgICAgICAgICA9IE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWDsKLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX09LOyAgCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9kZWwKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGVsZXRlcyBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBOb25lLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X2RzY3BfbWFwX2RlbCh2b2lkKQotewotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT1cblxyIik7Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgRFNDUCB0byBQLWJpdHMgbWFwcGluZyAqLwotICAgIGVsc2UgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfZHNjcF9tYXBfdGFibGUsIDAsIHNpemVvZihnc19kc2NwX21hcF90YWJsZSkpOwotICAgICAgICBnc19kc2NwX21hcF90YWJsZS5pbl91c2UgPSAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfY2xlYXIKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY2xlYXJzIGFsbCBHUE9OIGZsb3cgbWFwcGluZyBydWxlcwotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcih2b2lkKQotewotICAgIHVpbnQzMl90IHBiaXRzX2luZGV4ID0gMDsKLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVOVEVSPT1cblxyIik7Ci0gICAgfQotCi0gICAgLyogQ2xlYXIgVklEIGluZGV4IHRhYmxlICAgICAgICAgICAgICAqLwotICAgIG1lbXNldCgodWludDhfdCAqKSZnc192aWRfaW5kZXhfdGFibGUsIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWCwgc2l6ZW9mKGdzX3ZpZF9pbmRleF90YWJsZSkpOwotCi0gICAgLyogQ2xlYXIgUC1iaXRzIG1hcHBpbmcgdGFibGVzICAgICAgICAqLwotICAgIGZvciAocGJpdHNfaW5kZXg9MDsgcGJpdHNfaW5kZXg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IHBiaXRzX2luZGV4KyspIHsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtwYml0c19pbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVtwYml0c19pbmRleF0uaW5fdXNlID0gMDsKLSAgICAgICAgbWVtc2V0KCh1aW50OF90ICopJmdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtwYml0c19pbmRleF0sIDAsIHNpemVvZihtdl9jdXN0X3BiaXRzX21hcF90KSk7Ci0gICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVtwYml0c19pbmRleF0uaW5fdXNlID0gMDsgICAgICAgIAotICAgIH0KLQotICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVYSVQ9PVxuXHIiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTVZfQ1VTVF9PSzsgIAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCi0qKgotKiogIElOUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBwYXJzaW5nIHZpZCwgcGJpdHMsIGRpcgotKioKLSoqICBPVVRQVVRTOgotKiogICAgY3VzdF9mbG93ICAtIG91dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKiogICAgICAgICAgICAgICAgIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cwotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X3RhZ19tYXBfcnVsZV9nZXQobXZfY3VzdF9pb2N0bF9mbG93X21hcF90ICpjdXN0X2Zsb3cpCi17Ci0gICAgdWludDhfdCAgICAgICAgICAgICAgKnBWaWRFbnRyeSAgPSBOVUxMOwotICAgIG12X2N1c3RfcGJpdHNfbWFwX3QgICpwUGJpdHNNYXAgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgICAqcFBrdEZyd2QgICA9IE5VTEw7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIHZpZCAgICAgICAgPSAwOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0cyAgICAgID0gMDsgIAotICAgIG12X2N1c3RfZmxvd19kaXJfZSAgICBkaXIgICAgICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsgICAgIAotICAgIG12X2N1c3RfcGt0X2Zyd2RfdCAgICpwa3RfZndkICAgID0gTlVMTDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgaW5kZXggICAgICA9IDA7ICAgIAotCi0gICAgLyogR2V0IGlucHV0IHBhcmFtZXRlcnMgKi8KLSAgICB2aWQgICAgID0gY3VzdF9mbG93LT52aWQ7Ci0gICAgcGJpdHMgICA9IGN1c3RfZmxvdy0+cGJpdHM7Ci0gICAgZGlyICAgICA9IGN1c3RfZmxvdy0+ZGlyOwotICAgIHBrdF9md2QgPSAmY3VzdF9mbG93LT5wa3RfZnJ3ZDsKLSAgICAKLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FTlRFUj09OiB2aWRbJWRdLCBwYml0c1slZF0sIGRpclslZF1cblxyIiwgdmlkLCBwYml0cywgZGlyKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBWSUQgKi8KLSAgICBpZiAodmlkID4gKE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFIC0gMSkpIHsKLSAgICAgICAgTVZDVVNUX0VSUl9QUklOVChLRVJOX0VSUiAidmlkWyVkXSBleGNlZWRzIG1heGltdW0gdmFsdWVbJWRdIFxuXHIiLCB2aWQsIChNVl9DVVNUX1ZJRF9JTkRFWF9UQUJMRV9NQVhfU0laRSAtIDEpKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0gICAgCi0gICAgLyogQ2hlY2sgUC1iaXRzICovCi0gICAgaWYgKHBiaXRzID4gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkgewotICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJQLWJpdHNbJWRdIGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVslZF0gXG5cciIsIHBiaXRzLCBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBkaXIgKi8KLSAgICBpZiAoZGlyID49IE1WX0NVU1RfRkxPV19ESVJfTlVNKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImRpclslZF0gZXhjZWVkcyBtYXhpbXVtIHZhbHVlWyVkXSBcblxyIiwgZGlyLCBNVl9DVVNUX0ZMT1dfRElSX05VTS0xKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9ICAgIAotCi0gICAgLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCi0gICAgY3VzdF9mbG93LT5tb2RfdmlkICAgPSBNVl9DVVNUX1ZJRF9OT1RfQ0FSRV9WQUxVRTsKLSAgICBjdXN0X2Zsb3ctPm1vZF9wYml0cyA9IE1WX0NVU1RfUEJJVFNfTk9UX0NBUkVfVkFMVUU7IAotICAgIAotICAgIC8qIEZpbmQgVklEIGluZGV4IGVudHJ5IGJ5IFZJRCAqLyAgICAKLSAgICBwVmlkRW50cnkgPSAmZ3NfdmlkX2luZGV4X3RhYmxlW2Rpcl0ucGJpdHNfbWFwX2luZGV4W3ZpZF07Ci0KLSAgICBpZiAoKnBWaWRFbnRyeSA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAgLy9NVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICIlcywgcFZpZEVudHJ5WyVkXSwgTm8gbWF0Y2hlZCBQLWJpdHMgbWFwcGluZyB0YWJsZSBcblxyIixfX0ZVTkNUSU9OX18sICpwVmlkRW50cnkpOyAgICAKLQotICAgICAgICBwa3RfZndkLT5pbl91c2UgPSAwOwotICAgICAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI9PUVYSVQ9PVxuXHIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIH0KLQotICAgIC8qIEZpbmQgUC1iaXRzIG1hcHBpbmcgdGFibGUgKi8KLSAgICBwUGJpdHNNYXAgPSAmZ3NfcGJpdHNfbWFwX3RhYmxlW2Rpcl1bKnBWaWRFbnRyeV07ICAgIAotCi0gICAgLyogR2V0IHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uICovCi0gICAgaW5kZXggPSBwYml0czsKLQotICAgIHBQa3RGcndkID0gJnBQYml0c01hcC0+cGt0X2Z3ZFtpbmRleF07Ci0KLSAgICAvKiBJZiBzcGVjaWZpYyBmbG93IG1hcHBpbmcgcnVsZSBleGlzdHMgKi8KLSAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgIHBrdF9md2QtPnRyZ19wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+dHJnX3BvcnQ7Ci0gICAgICAgIGlmIChmYWxzZSA9PSBtdl9jdXN0X2dldF90Y29udF9zdGF0ZShwUGt0RnJ3ZC0+dHJnX3BvcnQpKQotICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gQ1BIX0lOVkFMSURfVFJHVF9RVUVVRTsKLSAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBrdF9md2QtPnRyZ19xdWV1ZSA9IHBQa3RGcndkLT50cmdfcXVldWU7Ci0gICAgICAgIHBrdF9md2QtPnRyZ19od2ZfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgcGt0X2Z3ZC0+Z2VtX3BvcnQgICAgICA9IHBQa3RGcndkLT5nZW1fcG9ydDsKLSAgICAgICAgY3VzdF9mbG93LT5tb2RfdmlkICAgICA9IHBQYml0c01hcC0+bW9kX3ZpZFtpbmRleF07Ci0gICAgICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgPSBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF07Ci0gICAgICAgIHBrdF9md2QtPmluX3VzZSAgICAgICAgPSAxOwotICAgICAgICAKLSAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJnX3BvcnQoJWQpLCB0cmdfcXVldWUoJWQpIHRyZ19od2ZfcXVldWUoJWQpIGdlbV9wb3J0KCVkKSwgbW9kX3ZpZCglZCksIG1vZF9wYml0cyglZClcblxyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCwgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQsIGN1c3RfZmxvdy0+bW9kX3ZpZCwgY3VzdF9mbG93LT5tb2RfcGJpdHMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICAvKiBJZiBzcGVjaWZpYyBmbG93IG1hcHBpbmcgcnVsZSBkb2VzIG5vdCBleGlzdCwgbG9vayBmb3IgZGVmYXVsdCBydWxlICovCi0gICAgZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsKLSAgICAgICAgcFBrdEZyd2QgPSAmcFBiaXRzTWFwLT5wa3RfZndkW2luZGV4XTsKLQotICAgICAgICAvKiBJZiBkZWZhdWx0IGZsb3cgbWFwcGluZyBydWxlIGV4aXN0cyAqLwotICAgICAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICBwa3RfZndkLT50cmdfcG9ydCAgICAgID0gcFBrdEZyd2QtPnRyZ19wb3J0OwotICAgICAgICAgICAgaWYgKGZhbHNlID09IG12X2N1c3RfZ2V0X3Rjb250X3N0YXRlKHBQa3RGcndkLT50cmdfcG9ydCkpCi0gICAgICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gQ1BIX0lOVkFMSURfVFJHVF9RVUVVRTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGt0X2Z3ZC0+dHJnX3F1ZXVlID0gcFBrdEZyd2QtPnRyZ19xdWV1ZTsKLSAgICAgICAgICAgIHBrdF9md2QtPnRyZ19od2ZfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX2h3Zl9xdWV1ZTsKLSAgICAgICAgICAgIHBrdF9md2QtPmdlbV9wb3J0ICAgICAgPSBwUGt0RnJ3ZC0+Z2VtX3BvcnQ7Ci0gICAgICAgICAgICBjdXN0X2Zsb3ctPm1vZF92aWQgICAgID0gcFBiaXRzTWFwLT5tb2RfdmlkW2luZGV4XTsKLSAgICAgICAgICAgIGN1c3RfZmxvdy0+bW9kX3BiaXRzICAgPSBwUGJpdHNNYXAtPm1vZF9wYml0c1tpbmRleF07Ci0gICAgICAgICAgICBwa3RfZndkLT5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmdfcG9ydCglZCksIHRyZ19xdWV1ZSglZCkgdHJnX2h3Zl9xdWV1ZSglZCkgZ2VtX3BvcnQoJWQpLCBtb2RfdmlkKCVkKSwgbW9kX3BiaXRzKCVkKVxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCwgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLmdlbV9wb3J0LCBjdXN0X2Zsb3ctPm1vZF92aWQsIGN1c3RfZmxvdy0+bW9kX3BiaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgICAgIHBrdF9md2QtPmluX3VzZSAgICAgID0gMDsKLSAgICAgICAgICAgIGlmIChnc19tdl9jdXN0X3RyYWNlX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgICAgICAgICB9ICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT1cblxyIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBkc2NwICAgICAgICAgLSBEU0NQIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgICAtIHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIFQtQ09OVCwgcXVldWUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KQotewotICAgIHVpbnQ4X3QgICAgICAgICAgICAgICpwVmlkRW50cnkgID0gTlVMTDsKLSAgICBtdl9jdXN0X3BiaXRzX21hcF90ICAqcFBiaXRzTWFwICA9IE5VTEw7Ci0gICAgbXZfY3VzdF9wa3RfZnJ3ZF90ICAgKnBQa3RGcndkICAgPSBOVUxMOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICBwYml0c0luZGV4ID0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRTsKLSAgICBtdl9jdXN0X2Zsb3dfZGlyX2UgICAgZGlyICAgICAgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgIGRzY3AgICAgICAgPSAwOwotCi0gICAgaWYgKGdzX212X2N1c3RfdHJhY2VfZmxhZykgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIj09RU5URVI9PTogZHNjcFslZF0gXG5cciIsIGRzY3ApOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRhcmdldCBwb3J0L3F1ZXVlL0dFTSBwb3J0ICovCi0gICAgaWYgKGN1c3RfZmxvdyA9PSBOVUxMKSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoS0VSTl9FUlIgImN1c3RfZmxvdyBpcyBOVUxMIFxuXHIiKTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBTZXQgZm9yd2FyZGluZyBmbGFnIHRvIGZhbHNlIGF0IGZpcnN0ICovCi0gICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5pbl91c2UgPSAwOwotICAgIGN1c3RfZmxvdy0+bW9kX3ZpZCAgICAgICAgID0gTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUU7Ci0gICAgY3VzdF9mbG93LT5tb2RfcGJpdHMgICAgICAgPSBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFOyAKLQotICAgIGRpciAgPSBjdXN0X2Zsb3ctPmRpcjsgIAotICAgIGRzY3AgPSBjdXN0X2Zsb3ctPmRzY3A7ICAKLQotICAgIC8qIENoZWNrIERTQ1AgKi8KLSAgICBpZiAoZHNjcCA8IE1WX0NVU1RfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRSkgewotICAgICAgICBpZiAoZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlICE9IDApIHsKLSAgICAgICAgICAgIHBiaXRzSW5kZXggPSBnc19kc2NwX21hcF90YWJsZS5wYml0c1tkc2NwXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKHBiaXRzSW5kZXggPiBNVl9DVVNUX1BCSVRTX05PVF9DQVJFX1ZBTFVFKXsKLSAgICAgICAgLy9NVkNVU1RfRVJSX1BSSU5UKEtFUk5fRVJSICJwYml0c0luZGV4WyVkXSBpcyBpbGxlZ2FsIFxuXHIiLCBwYml0c0luZGV4KTsKLSAgICAgICAgcmV0dXJuIE1WX0NVU1RfRkFJTDsKLSAgICB9Ci0KLSAgICAvKiBGaW5kIFAtYml0cyBtYXBwaW5nIHRhYmxlICovCi0gICAgcFZpZEVudHJ5ID0gJmdzX3ZpZF9pbmRleF90YWJsZVtkaXJdLnBiaXRzX21hcF9pbmRleFtNVl9DVVNUX0RFRkFVTFRfVU5UQUdfUlVMRV07Ci0KLSAgICBpZiAoKnBWaWRFbnRyeSA+PSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkgewotICAgICAgICAvL01WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sIiVzLCBwVmlkRW50cnlbJWRdLCBkb2VzIG5vdCBleGlzdCBcblxyIixfX0ZVTkNUSU9OX18sICpwVmlkRW50cnkpOyAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgcFBiaXRzTWFwID0gJmdzX3BiaXRzX21hcF90YWJsZVtkaXJdWypwVmlkRW50cnldOwotCi0gICAgICAgIGlmIChwUGJpdHNNYXAtPmluX3VzZSAhPSAwKSB7Ci0KLSAgICAgICAgICAgIHBQa3RGcndkICA9ICZwUGJpdHNNYXAtPnBrdF9md2RbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICBpZiAocFBrdEZyd2QtPmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcG9ydCAgICAgID0gcFBrdEZyd2QtPnRyZ19wb3J0OyAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBtdl9jdXN0X2dldF90Y29udF9zdGF0ZShwUGt0RnJ3ZC0+dHJnX3BvcnQpKQotICAgICAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19xdWV1ZSA9IENQSF9JTlZBTElEX1RSR1RfUVVFVUU7Ci0gICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC50cmdfcXVldWUgPSBwUGt0RnJ3ZC0+dHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9IHBQa3RGcndkLT50cmdfaHdmX3F1ZXVlOwotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IHBQa3RGcndkLT5nZW1fcG9ydDsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3ctPm1vZF92aWQgICAgICAgICAgICAgICAgPSBwUGJpdHNNYXAtPm1vZF92aWRbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5tb2RfcGJpdHMgICAgICAgICAgICAgID0gcFBiaXRzTWFwLT5tb2RfcGJpdHNbcGJpdHNJbmRleF07Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJnX3BvcnQoJWQpLCB0cmdfcXVldWUoJWQpLCB0cmdfaHdmX3F1ZXVlKCVkKSwgZ2VtX3BvcnQoJWQpLCBtb2RfdmlkKCVkKSwgbW9kX3BiaXRzKCVkKVxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3BvcnQsIGN1c3RfZmxvdy0+cGt0X2Zyd2QudHJnX3F1ZXVlLCBjdXN0X2Zsb3ctPnBrdF9mcndkLnRyZ19od2ZfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdF9mbG93LT5wa3RfZnJ3ZC5nZW1fcG9ydCwgY3VzdF9mbG93LT5tb2RfdmlkLCBjdXN0X2Zsb3ctPm1vZF9wYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBNVl9DVVNUX09LOwotICAgICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAKLSAgICB9Ci0KLSAgICBpZiAoZ3NfbXZfY3VzdF90cmFjZV9mbGFnKSB7Ci0gICAgICAgIE1WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiPT1FWElUPT06XG5cciIpOwotICAgIH0KLQotICAgIHJldHVybiBNVl9DVVNUX0ZBSUw7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZGlzcGxheXMgdmFsaWQgR1BPTiBmbG93IG1hcHBpbmcgdGFibGVzIGFuZCBEU0NQIAotKiogICAgICAgICAgICAgICAgIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlZm9yIHVudGFnZ2VkIGZyYW1lcy4KLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIE5vbmUuCi0qKgotKiogICAgT1VUUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9DVVNUX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQodm9pZCkKLXsKLSAgICB1aW50MzJfdCAgaW5kZXggPSAwOwotICAgIHVpbnQzMl90ICB0YWJsZV9pbmRleCA9IDA7Ci0KLSAgICAvL01WQ1VTVF9UUkFDRV9QUklOVChLRVJOX0lORk8sIj09RU5URVI9PVxuXHIiKTsKLQotICAgIC8qIFByaW50IFZhbGlkIFZJRCBpbmRleCBlbnRyaWVzICovCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiSW4gVXBzdHJlYW0gRGlyZWN0aW9uICAgICAgXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBWTEFOIElEIEluZGV4IFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgICAgICAgICAKLSAgICBwcmludGsoS0VSTl9JTkZPICJWSUQgICBQLWJpdHNfdGFibGVfaW5kZXhcbiIpOwotICAgIGZvciAoaW5kZXg9MDsgaW5kZXg8TVZfQ1VTVF9WSURfSU5ERVhfVEFCTEVfTUFYX1NJWkU7IGluZGV4KyspIHsKLSAgICAgICAgaWYoZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdLnBiaXRzX21hcF9pbmRleFtpbmRleF0gPCBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSkKLSAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIiU0LjRkICAgJWRcbiIsIGluZGV4LCBnc192aWRfaW5kZXhfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU10ucGJpdHNfbWFwX2luZGV4W2luZGV4XSk7ICAgIAotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7Ci0KLSAgICAvKiBQcmludCBQLWJpdHMgbWFwcGluZyB0YWJsZXMgKi8KLSAgICBwcmludGsoS0VSTl9JTkZPICJNVl9DVVNUIFAtYml0cyBGbG93IE1hcHBpbmcgVGFibGVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiIpOyAgCi0gICAgZm9yICh0YWJsZV9pbmRleD0wOyB0YWJsZV9pbmRleDxNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRTsgdGFibGVfaW5kZXgrKykgewotICAgICAgICBpZihnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLmluX3VzZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUC1iaXRzIEZsb3cgTWFwcGluZyBUYWJsZSAlZFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwgdGFibGVfaW5kZXgpOyAKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJQLWJpdHMgIGluX3VzZSAgbW9kX3ZpZCBtb2RfcGJpdHMgdHJnX3BvcnQgIHRyZ19xdWV1ZSAgdHJnX2h3Zl9xdWV1ZSAgZ2VtX3BvcnRcbiIpOyAKLSAgICAgICAgICAgICAgICBmb3IgKGluZGV4PTA7IGluZGV4PE1WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU07IGluZGV4KyspIAotICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlMS4xZCAgICAgICAlMy4zcyAgICAgJTQuNGQgICAgJTEuMWQgICAgICAgICAgJTIuMmQgICAgICAgICUyLjJkICAgICAgICAgJTIuMmQgICAgICAgICAgICAlNC40ZFxuIiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLmluX3VzZSE9MCk/ICJZRVMiOiIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5tb2RfdmlkW2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ubW9kX3BiaXRzW2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX1VTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0udHJnX3BvcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS50cmdfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19od2ZfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9VU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLmdlbV9wb3J0KTsgICAgCi0gICAgICAgIAotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKLQotICAgIHByaW50ayhLRVJOX0lORk8gIkluIERvd25zdHJlYW0gRGlyZWN0aW9uICAgIFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IAotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgVkxBTiBJRCBJbmRleCBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAgICAgICAgCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiVklEICAgUC1iaXRzX3RhYmxlX2luZGV4XG4iKTsKLSAgICBmb3IgKGluZGV4PTA7IGluZGV4PE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmKGdzX3ZpZF9pbmRleF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXS5wYml0c19tYXBfaW5kZXhbaW5kZXhdIDwgTVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkUpCi0gICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlNC40ZCAgICVkXG4iLCBpbmRleCwgZ3NfdmlkX2luZGV4X3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdLnBiaXRzX21hcF9pbmRleFtpbmRleF0pOyAgICAKLSAgICB9Ci0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5cbiIpOwotCi0gICAgLyogUHJpbnQgUC1iaXRzIG1hcHBpbmcgdGFibGVzICovCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBQLWJpdHMgRmxvdyBNYXBwaW5nIFRhYmxlc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsgIAotICAgIGZvciAodGFibGVfaW5kZXg9MDsgdGFibGVfaW5kZXg8TVZfQ1VTVF9NQVhfUEJJVFNfTUFQX1RBQkxFX1NJWkU7IHRhYmxlX2luZGV4KyspIHsKLSAgICAgICAgaWYoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5pbl91c2UgIT0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gIlAtYml0cyBGbG93IE1hcHBpbmcgVGFibGUgJWRcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIsIHRhYmxlX2luZGV4KTsgCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiUC1iaXRzICBpbl91c2UgIG1vZF92aWQgbW9kX3BiaXRzIHRyZ19xdWV1ZSAgdHJnX2h3Zl9xdWV1ZSAgXG4iKTsgCi0gICAgICAgICAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNOyBpbmRleCsrKSAKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTEuMWQgICAgICAgJTMuM3MgICAgICU0LjRkICAgICUxLjFkICAgICAgICAlMi4yZCAgICAgICAgICUyLjJkICAgICAgICAgICAgICBcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW3RhYmxlX2luZGV4XS5wa3RfZndkW2luZGV4XS5pbl91c2UhPTApPyAiWUVTIjoiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0ubW9kX3ZpZFtpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLm1vZF9wYml0c1tpbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc19wYml0c19tYXBfdGFibGVbTVZfQ1VTVF9GTE9XX0RJUl9EU11bdGFibGVfaW5kZXhdLnBrdF9md2RbaW5kZXhdLnRyZ19xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdzX3BiaXRzX21hcF90YWJsZVtNVl9DVVNUX0ZMT1dfRElSX0RTXVt0YWJsZV9pbmRleF0ucGt0X2Z3ZFtpbmRleF0udHJnX2h3Zl9xdWV1ZSk7ICAgIAotICAgICAgICAKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGsoS0VSTl9JTkZPICJcblxuIik7ICAgIAotCi0gICAgLyogUHJpbnQgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIHByaW50ayhLRVJOX0lORk8gIk1WX0NVU1QgRFNDUCB0byBQLWJpdHMgTWFwcGluZyBUYWJsZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAKLSAgICBpZiAoZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID09IDApIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTm8gRFNDUCB0byBQLWJpdHMgbWFwcGluZ1xuIik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiRFNDUCAgUGJpdHNcbiIpOyAKLSAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNOyBpbmRleCsrKQotICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiJTIuMmQgICAgICUxLjFkXG4iLCAKLSAgICAgICAgICAgICAgICAgICBpbmRleCwgZ3NfZHNjcF9tYXBfdGFibGUucGJpdHNbaW5kZXhdKTsgICAgCi0gICAgfQotICAgIHByaW50ayhLRVJOX0lORk8gIlxuXG4iKTsKLQotICAgIC8vTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fSU5GTywiPT1FWElUPT1cblxyIik7ICAgIAotICAgIHJldHVybiBNVl9DVVNUX09LOyAKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X2Zsb3dfbWFwX2luaXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgbXZfY3VzdCBmbG93IG1hcHBpbmcgZGF0YSBzdHJ1Y3R1cmUuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBOb25lLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi1pbnQgbXZfY3VzdF9mbG93X21hcF9pbml0KHZvaWQpCi17Ci0gICAgdWludDMyX3QgaW5kZXggPSAwOwotICAgIAotICAgIC8qIEluaXRpYWxpemVzIFZJRCBpbmRleCB0YWJsZSAgICAgICAgICAgICAgKi8KLSAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfdmlkX2luZGV4X3RhYmxlLCBNVl9DVVNUX0lOVkFMSURfUEJJVFNfVEFCTEVfSU5ERVgsIHNpemVvZihnc192aWRfaW5kZXhfdGFibGUpKTsKLQotICAgIC8qIEluaXRpYWxpemVzIFAtYml0cyBtYXBwaW5nIHRhYmxlcyAgICAgICAgKi8KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRTsgaW5kZXgrKykgewotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW2luZGV4XSwgMCwgc2l6ZW9mKG12X2N1c3RfcGJpdHNfbWFwX3QpKTsKLSAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfVVNdW2luZGV4XS5pbl91c2UgPSAwOwotICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikmZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW2luZGV4XSwgMCwgc2l6ZW9mKG12X2N1c3RfcGJpdHNfbWFwX3QpKTsKLSAgICAgICAgZ3NfcGJpdHNfbWFwX3RhYmxlW01WX0NVU1RfRkxPV19ESVJfRFNdW2luZGV4XS5pbl91c2UgPSAwOyAgICAgICAgCi0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSAqLwotICAgIG1lbXNldCgodWludDhfdCAqKSZnc19kc2NwX21hcF90YWJsZSwgMCwgc2l6ZW9mKG12X2N1c3RfZHNjcF9wYml0c190KSk7Ci0gICAgZ3NfZHNjcF9tYXBfdGFibGUuaW5fdXNlID0gMDsKLQotICAgIC8qIEluaXRpYWxpemVzIFQtQ09OVCBzdGF0ZSwgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZSAqLwotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IENQSF9NQVhfVENPTlRfTlVNOyBpbmRleCsrKQotICAgICAgICBnc190Y29udF9zdGF0ZVtpbmRleF0gPSBmYWxzZTsKLSAgICAgICAgCi0gICAgcmV0dXJuIE1WX0NVU1RfT0s7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0IFQtQ09OVCBzdGF0ZQotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqCi0qKiBPVVRQVVRTOgotKiogICBOb25lLiAKLSoqCi0qKiBSRVRVUk5TOiAgICAgCi0qKiAgIHN0YXRlIC0gU3RhdGUgb2YgVC1DT05ULCBlbmFibGVkIG9yIGRpc2FibGVkLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWJvb2wgbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUodWludDMyX3QgdGNvbnQpCi17Ci0gICAgLyogQ2hlY2sgdGNvbnQgKi8KLSAgICBpZiAodGNvbnQgPj0gQ1BIX01BWF9UQ09OVF9OVU0pCi0gICAgewotICAgICAgICBNVkNVU1RfVFJBQ0VfUFJJTlQoS0VSTl9FUlIsInRjb250WyVkXSBpcyBpbGxlZ2FsLCBzaG91bGQgYmUgbGVzcyB0aGFuIFslZF1cbiIsIHRjb250LCBDUEhfTUFYX1RDT05UX05VTSk7IAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdzX3Rjb250X3N0YXRlW3Rjb250XTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiBtdl9jdXN0X3NldF90Y29udF9zdGF0ZQotKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIFQtQ09OVCBzdGF0ZSBpbiBtdl9jdXN0Ci0qKgotKiogSU5QVVRTOgotKiogICB0Y29udCAtIFQtQ09OVAotKiogICBzdGF0ZSAtIFN0YXRlIG9mIFQtQ09OVCwgZW5hYmxlZCBvciBkaXNhYmxlZC4KLSoqCi0qKiBPVVRQVVRTOgotKiogICBOb25lLiAKLSoqCi0qKiBSRVRVUk5TOiAgICAgCi0qKiAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX09LKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHVpbnQzMl90IHRjb250LCBib29sIHN0YXRlKQotewotICAgIC8qIENoZWNrIHRjb250ICovCi0gICAgaWYgKHRjb250ID49IENQSF9NQVhfVENPTlRfTlVNKQotICAgIHsKLSAgICAgICAgTVZDVVNUX1RSQUNFX1BSSU5UKEtFUk5fRVJSLCJ0Y29udFslZF0gaXMgaWxsZWdhbCwgc2hvdWxkIGJlIGxlc3MgdGhhbiBbJWRdXG4iLCB0Y29udCwgQ1BIX01BWF9UQ09OVF9OVU0pOyAKLSAgICAgICAgcmV0dXJuIE1WX0ZBSUw7Ci0gICAgfQotCi0gICAgLyogQXBwbHkgdC1jb250IHN0YXRlIHRvIG12X2N1c3QgKi8KLSAgICBnc190Y29udF9zdGF0ZVt0Y29udF0gPSBzdGF0ZTsKLQotICAgIHJldHVybiBNVl9PSzsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X2Zsb3dfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDc4NzU0MmEuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3RfZmxvd19tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X2Zsb3dfbWFwLmgKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgVmljdG9yICAtIGluaXRpYWwgdmVyc2lvbiBjcmVhdGVkLiAgIDEyL0RlYy8yMDExIAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19tdl9jdXN0X2Zsb3dfbWFwX2hfXwotI2RlZmluZSBfX212X2N1c3RfZmxvd19tYXBfaF9fCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSBFbnVtIGFuZCBTdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNVkNVU1RfVFJBQ0VfUFJJTlQobGV2ZWwsIGZvcm1hdCwgLi4uKSAgIHByaW50ayhsZXZlbCAiJXMoJWQpOiJmb3JtYXQsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTVZfQ1VTVF9PSyAgICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBNVl9DVVNUX0ZBSUwgICAgICAgICAgICAgICAgICAgICAgKDEpCi0KLSNkZWZpbmUgQ1BIX01BWF9UQ09OVF9OVU0gICAgICAgICAgICAgICAgICg4KSAgICAvKiBNYXhpbXVtIFQtQ09OVCBudW1iZXIgICAgKi8KLSNkZWZpbmUgQ1BIX0lOVkFMSURfVFJHVF9RVUVVRSAgICAgICAgICAgICgweEZGKSAvKiBJbnZhbGlkIHRhcmdldCBxdWV1ZSBudW1iZXIgICovCi0KLSNkZWZpbmUgTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUUgICAgICAgICg0MDk2KSAvKiBEb2VzIG5vdCBjYXJlIGZvciBWSUQgICAgKi8KLSNkZWZpbmUgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSAgICAgICg4KSAgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBQLWJpdHMgKi8KLSNkZWZpbmUgTVZfQ1VTVF9EU0NQX05PVF9DQVJFX1ZBTFVFICAgICAgICg2NCkgICAvKiBEb2VzIG5vdCBjYXJlIGZvciBEU0NQICAgKi8KLQotI2RlZmluZSBNVl9DVVNUX01BWF9UUkdfUE9SVF9WQUxVRSAgICAgICAgKDgtMSkgIC8qIE1heGltdW0gdGFyZ2V0IHBvcnQgdmFsdWUsIFQtQ09OVDcgKi8KLSNkZWZpbmUgTVZfQ1VTVF9NQVhfVFJHX1FVRVVFX1ZBTFVFICAgICAgICg3KSAgICAvKiBNYXhpbXVtIHRhcmdldCBxdWV1ZSB2YWx1ZSAgICAgICAgICovCi0jZGVmaW5lIE1WX0NVU1RfTUFYX0dFTV9QT1JUX1ZBTFVFICAgICAgICAoNDA5NSkgLyogTWF4aW11bSBHRU0gcG9ydCB2YWx1ZSAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIE1WX0NVU1RfSU5WQUxJRF9QQklUU19UQUJMRV9JTkRFWCAoMHhmZikgLyogSW52YWxpZCBQYml0cyB0YWJsZSBpbmRleCB2YWx1ZSBpbiBWSUQgaW5kZXggdGFibGUqLwotCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9VTlRBR19SVUxFICAgICAgICAoNDA5NisxKS8qIERlZmF1bHQgdW50YWdnZWQgIHJ1bGUgICAgICAgICovCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEUgICAoNDA5NisyKS8qIERlZmF1bHQgc2lubGdlIHRhZ2dlZCAgcnVsZSAgICovCi0jZGVmaW5lIE1WX0NVU1RfREVGQVVMVF9ET1VCTEVfVU5UQUdfUlVMRSAoNDA5NiszKS8qIERlZmF1bHQgZG91YmxlIHRhZ2dlZCAgcnVsZSAgICovCi0KLS8qIFZMQU4gSUQgaW5kZXggdGFibGUgZGVmaW5pdGlvbiBmb3IgZmxvdyBtYXBwaW5nICovCi0jZGVmaW5lIE1WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFICAoNDA5Nis0KQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgcGJpdHNfbWFwX2luZGV4W01WX0NVU1RfVklEX0lOREVYX1RBQkxFX01BWF9TSVpFXTsKLX0gbXZfY3VzdF92aWRfaW5kZXhfdDsKLQotLyogUC1iaXRzIGZsb3cgbWFwcGluZyB0YWJsZSBkZWZpbml0aW9uICovCi10eXBlZGVmIHVpbnQzMl90IG12X2N1c3RfdHJnX3BvcnRfdHlwZV90OwotdHlwZWRlZiB1aW50MzJfdCBtdl9jdXN0X2dlbV9wb3J0X2tleV90OwotdHlwZWRlZiBzdHJ1Y3QgbXZfY3VzdF9wa3RfZnJ3ZCB7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgaW5fdXNlOwotICAgIG12X2N1c3RfdHJnX3BvcnRfdHlwZV90IHRyZ19wb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgdHJnX3F1ZXVlOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB0cmdfaHdmX3F1ZXVlOyAgICAKLSAgICBtdl9jdXN0X2dlbV9wb3J0X2tleV90ICBnZW1fcG9ydDsKLX0gbXZfY3VzdF9wa3RfZnJ3ZF90OwotCi0jZGVmaW5lIE1WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU0gICAoOCsxKQotI2RlZmluZSBNVl9DVVNUX01BWF9QQklUU19NQVBfVEFCTEVfU0laRSAgKDY0KQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3QgICAgICAgICAgIGluX3VzZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgbW9kX3ZpZFtNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgbW9kX3BiaXRzW01WX0NVU1RfUEJJVFNfTUFQX01BWF9FTlRSWV9OVU1dOyAgICAKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgcGt0X2Z3ZFtNVl9DVVNUX1BCSVRTX01BUF9NQVhfRU5UUllfTlVNXTsKLX0gbXZfY3VzdF9wYml0c19tYXBfdDsKLQotLyogRFNDUCB0byBQLWJpdHMgbWFwcGluZyB0YWJsZSBkZWZpbml0aW9uICovCi0jZGVmaW5lIE1WX0NVU1RfRFNDUF9QQklUU19UQUJMRV9NQVhfU0laRSAgKDY0KQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQzMl90IGluX3VzZTsKLSAgICB1aW50OF90ICBwYml0c1tNVl9DVVNUX0RTQ1BfUEJJVFNfVEFCTEVfTUFYX1NJWkVdOwotfSBtdl9jdXN0X2RzY3BfcGJpdHNfdDsKLSAKLXR5cGVkZWYgZW51bQotewotICAgIE1WX0NVU1RfRkxPV19ESVJfVVMgICA9IDAsCi0gICAgTVZfQ1VTVF9GTE9XX0RJUl9EUyAgID0gMSwKLSAgICBNVl9DVVNUX0ZMT1dfRElSX05VTSAgPSAyCi19IG12X2N1c3RfZmxvd19kaXJfZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBtdl9jdXN0X2Zsb3dfZGlyX2UgZGlyOwotICAgIGludCAgICAgICAgICAgICAgICB2aWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIHBiaXRzOwotICAgIGludCAgICAgICAgICAgICAgICBkc2NwOyAgCi0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF92aWQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIG1vZF9wYml0czsKLSAgICBtdl9jdXN0X3BrdF9mcndkX3QgcGt0X2Zyd2Q7Ci19IG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gRGVjbGFyYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X3NldF90cmFjZV9mbGFnCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgbXZfY3VzdCB0cmFjZSBmbGFnLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgZW5UcmFjZSAgICAgLSBFbmFibGUgb3IgZGlzYWJsZSBtdl9jdXN0IHRyYWNlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gICAgCi1pbnQgbXZfY3VzdF9zZXRfdHJhY2VfZmxhZyh1aW50MzJfdCBlblRyYWNlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF9ydWxlX3NldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBjdXN0X2Zsb3cgIC0gVkxBTiBJRCwgODAyLjFwIHZhbHVlLCBwa3RfZndkIGluZm9ybWF0aW9uLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIE5vbmUuIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX3NldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9kc2NwX21hcF9zZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBHUE9OIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgSU5QVVRTOgotKiogICAgZHNjcF9tYXAgICAtIERTQ1AgdG8gUC1iaXRzIG1hcHBpbmcgcnVsZXMuCi0qKgotKiogIE9VVFBVVFM6Ci0qKiAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X2RzY3BfbWFwX3NldChtdl9jdXN0X2RzY3BfcGJpdHNfdCAqZHNjcF9tYXApOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfbWFwX3J1bGVfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgR1BPTiBmbG93IG1hcHBpbmcgcnVsZXMKLSoqCi0qKiAgICBJTlBVVFM6Ci0qKiAgICAgIHZpZCAgICAgICAgIC0gVkxBTiBJRC4KLSoqICAgICAgcGJpdHMgICAgICAtIDgwMi4xcCB2YWx1ZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lIAotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKE1WX0NVU1RfT0spLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogICAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX2RlbCh1aW50MTZfdCB2aWQsIHVpbnQ4X3QgcGJpdHMsIG12X2N1c3RfZmxvd19kaXJfZSBkaXIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfZHNjcF9tYXBfZGVsCi0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGRlbGV0ZXMgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlcwotKioKLSoqICBJTlBVVFM6Ci0qKiAgICBOb25lLgotKioKLSoqICBPVVRQVVRTOgotKiogICAgTm9uZS4gCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9kc2NwX21hcF9kZWwodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcgotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjbGVhcnMgYWxsIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGVzCi0qKgotKiogIElOUFVUUzoKLSoqICAgIE5vbmUuCi0qKgotKiogIE9VVFBVVFM6Ci0qKiAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoMCkuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBtdl9jdXN0X21hcF9ydWxlX2NsZWFyKHZvaWQpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioKLSoqICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXRzIEdQT04gZmxvdyBtYXBwaW5nIHJ1bGUgZm9yIHRhZ2dlZCBmcmFtZXMuCi0qKgotKiogIElOUFVUUzoKLSoqICAgIGN1c3RfZmxvdyAgLSBwYXJzaW5nIHZpZCwgcGJpdHMsIGRpcgotKioKLSoqICBPVVRQVVRTOgotKiogICAgY3VzdF9mbG93ICAtIG91dCBwYWNrZXQgZm9yd2FyZGluZyBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIEdFTSBwb3J0LCBULUNPTlQsIHF1ZXVlLgotKiogICAgICAgICAgICAgICAgIGFuZCBwYWNrZXQgbW9kaWZpY2F0aW9uIGZvciBWSUQsIFAtYml0cwotKioKLSoqICAgIFJFVFVSTlM6ICAgICAKLSoqICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldChtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgKmN1c3RfZmxvdyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQKLSoqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICAgIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gZ2V0cyBHUE9OIGZsb3cgbWFwcGluZyBydWxlIGZvciB1bnRhZ2dlZCBmcmFtZXMuCi0qKgotKiogICAgSU5QVVRTOgotKiogICAgICBkc2NwICAgICAgICAgLSBEU0NQIHZhbHVlLgotKioKLSoqICAgIE9VVFBVVFM6Ci0qKiAgICAgIGN1c3RfZmxvdyAgICAtIHBhY2tldCBmb3J3YXJkaW5nIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgR0VNIHBvcnQsIFQtQ09OVCwgcXVldWUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgICBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAoTVZfQ1VTVF9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgICByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotaW50IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAqY3VzdF9mbG93KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgICBtdl9jdXN0X21hcF90YWJsZV9wcmludAotKiogICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogICAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBkaXNwbGF5cyB2YWxpZCBHUE9OIGZsb3cgbWFwcGluZyB0YWJsZXMgYW5kIERTQ1AgCi0qKiAgICAgICAgICAgICAgIHRvIFAtYml0cyBtYXBwaW5nIHRhYmxlZm9yIHVudGFnZ2VkIGZyYW1lcy4KLSoqCi0qKiAgSU5QVVRTOgotKiogICAgTm9uZS4KLSoqCi0qKiAgT1VUUFVUUzoKLSoqICAgIE5vbmUuCi0qKgotKiogICAgUkVUVVJOUzogICAgIAotKiogICAgT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgKDApLiBPbiBlcnJvciBkaWZmZXJlbnQgdHlwZXMgYXJlIAotKiogIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQodm9pZCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogICAgbXZfY3VzdF9mbG93X21hcF9pbml0Ci0qKiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqCi0qKiAgICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGluaXRpYWxpemVzIG12X2N1c3QgZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlLgotKioKLSoqICAgIElOUFVUUzoKLSoqICAgICAgTm9uZS4KLSoqCi0qKiAgICBPVVRQVVRTOgotKiogICAgICBOb25lLiAKLSoqCi0qKiAgICBSRVRVUk5TOiAgICAgCi0qKiAgICAgIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zICgwKS4gT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSAKLSoqICAgIHJldHVybmVkIGFjY29yZGluZyB0byB0aGUgY2FzZS4gIAotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgIAotaW50IG12X2N1c3RfZmxvd19tYXBfaW5pdCh2b2lkKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiBtdl9jdXN0X2dldF90Y29udF9zdGF0ZQotKiogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBnZXQgVC1DT05UIHN0YXRlCi0qKgotKiogSU5QVVRTOgotKiogICB0Y29udCAtIFQtQ09OVAotKioKLSoqIE9VVFBVVFM6Ci0qKiAgIE5vbmUuIAotKioKLSoqIFJFVFVSTlM6ICAgICAKLSoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuICAKLSoqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYm9vbCBtdl9jdXN0X2dldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUKLSoqIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBULUNPTlQgc3RhdGUgaW4gbXZfY3VzdAotKioKLSoqIElOUFVUUzoKLSoqICAgdGNvbnQgLSBULUNPTlQKLSoqICAgc3RhdGUgLSBTdGF0ZSBvZiBULUNPTlQsIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0qKgotKiogT1VUUFVUUzoKLSoqICAgTm9uZS4gCi0qKgotKiogUkVUVVJOUzogICAgIAotKiogIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbiByZXR1cm5zIChNVl9PSykuIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgCi0qKiAgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlLiAgCi0qKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBtdl9jdXN0X3NldF90Y29udF9zdGF0ZSh1aW50MzJfdCB0Y29udCwgYm9vbCBzdGF0ZSk7Ci0KLSNlbmRpZiAvKiBfX212X2N1c3RfZmxvd19tYXBfaF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tbmdfaWYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21uZ19pZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0NzBhODFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21uZ19pZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCi0qIAotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKiAKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X21uZ19pZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotKiBERVNDUklQVElPTiA6IFRoaXMgZmlsZSBjb250YWlucyBPTlUgTVYgQ1VTVCBNYW5hZ2VtZW50IEludGVyZmFjZSAgICAgICAgCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0NVU1RfTU5HX0lGX0hfCi0jZGVmaW5lIF9NVl9DVVNUX01OR19JRl9IXwotCi0vKiBJbmNsdWRlIEZpbGVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLQotLyogRGVmaW5pdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfT01DSV9TRVQgICAgICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMSwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9FT0FNX0xMSURfU0VUICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICAyLCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0VPQU1fRU5BQkxFICAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDMsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfT01DSV9FTkFCTEUgICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgNCwgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9NQVBfUlVMRV9TRVQgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA1LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0RTQ1BfTUFQX1NFVCAgICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDYsICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfTUFQX1JVTEVfREVMICAgICAgICAgICAgX0lPVyhNVl9DVVNUX0lPQ1RMX01BR0lDLCAgNywgIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9EU0NQX01BUF9ERUwgICAgICAgICAgICBfSU9XKE1WX0NVU1RfSU9DVExfTUFHSUMsICA4LCAgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX01BUF9SVUxFX0NMRUFSICAgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDksICB1bnNpZ25lZCBpbnQpCi0jZGVmaW5lIE1WX0NVU1RfSU9DVExfVEFHX01BUF9SVUxFX0dFVCAgICAgICAgX0lPUihNVl9DVVNUX0lPQ1RMX01BR0lDLCAgMTAsIHVuc2lnbmVkIGludCkKLSNkZWZpbmUgTVZfQ1VTVF9JT0NUTF9VTlRBR19NQVBfUlVMRV9HRVQgICAgICBfSU9SKE1WX0NVU1RfSU9DVExfTUFHSUMsICAxMSwgdW5zaWduZWQgaW50KQotI2RlZmluZSBNVl9DVVNUX0lPQ1RMX0FQUF9FVEhfVFlQRV9TRVQgICAgICAgIF9JT1coTVZfQ1VTVF9JT0NUTF9NQUdJQywgIDEyLCB1bnNpZ25lZCBpbnQpCi0KLS8qIEVudW1zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBUeXBlZGVmcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50ICAgICAgICAgICAgICAgIHRjb250OwotICAgIGludCAgICAgICAgICAgICAgICB0eHE7Ci0gICAgaW50ICAgICAgICAgICAgICAgIGdlbXBvcnQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgIGtlZXBfcnhfbWg7Ci19IG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBpbnQgICAgICAgICAgICAgICAgbGxpZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgdHhxOwotICAgIHVpbnQ4X3QgICAgICAgICAgICBsbGlkX21hY1s2XTsKLX0gbXZfY3VzdF9pb2N0bF9sbGlkX3NldF90OwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG12X2N1c3RfZHNjcF9wYml0c190IGRzY3BfbWFwOwotfSBtdl9jdXN0X2lvY3RsX2RzY3BfbWFwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgbXZfY3VzdF9hcHBfdHlwZV9lIGFwcF90eXBlOwotICAgIHVpbnQxNl90ICAgICAgICAgICBldGhfdHlwZTsKLX0gbXZfY3VzdF9pb2N0bF9hcHBfZXR5cGVfdDsKLQotLyogTVZfQ1VTVCBDaGFyIERldmljZSBTdHJ1Y3R1cmUgKi8KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIG12X2N1c3RfaW9jdGxfb21jaV9zZXRfdCAgICAgIG12X2N1c3RfaW9jdGxfb21jaV9zZXQ7Ci0gIG12X2N1c3RfaW9jdGxfbGxpZF9zZXRfdCAgICAgIG12X2N1c3RfaW9jdGxfbGxpZF9zZXQ7Ci0gIG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCAgICAgIG12X2N1c3RfaW9jdGxfZmxvd19tYXA7Ci0gIG12X2N1c3RfaW9jdGxfZHNjcF9tYXBfdCAgICAgIG12X2N1c3RfaW9jdGxfZHNjcF9tYXA7Ci0gIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlX3QgICAgIG12X2N1c3RfaW9jdGxfYXBwX2V0eXBlOwotCi0gIHN0cnVjdCBjZGV2ICBjZGV2OwotfSBtdl9jdXN0X2NkZXZfdDsKLQotLyogR2xvYmFsIHZhcmlhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIHZhcmlhYmxlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2xvYmFsIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogTWFjcm9zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZW5kaWYgLyogX01WX0NVU1RfTU5HX0lGX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9tb2QuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2U5MjE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X21vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKEMpIDIwMTAsIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCi0qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIAotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSogCi0qIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKLSogbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCi0qIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcwotKiBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCi0qIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKLSogb24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCi0qIAotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfbW9kLmMKLSoKLSogREVTQ1JJUFRJT046Ci0qICAgICAgIAotKiAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotCi0KLSNpZmRlZiBNT0RVTEVfTElDRU5TRQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtdl9jdXN0X21vZF9leGl0KHZvaWQpCi17Ci0gICAgbXZjdXN0X2Rldl9zaHV0ZG93bigpOwotfQotbW9kdWxlX2V4aXQobXZfY3VzdF9tb2RfZXhpdCk7Ci0KLQotc3RhdGljIGludCBfX2luaXQgbXZfY3VzdF9tb2RfaW5pdCh2b2lkKQotewotICAgIGlmIChtdmN1c3RfZGV2X2luaXQoKSAhPSAwKQotICAgIHsKLSAgICAgICAgLy9tdl9jdXN0X21vZF9leGl0KCk7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiAiXG5NVl9DVVNUIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQgXG5cbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiXG5NVl9DVVNUIG1vZHVsZSBpbnNlcnRlZCAtICVzXG5cbiIsTVZfQ1VTVF9WRVJTSU9OKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vL21vZHVsZV9pbml0KG12X2N1c3RfbW9kX2luaXQpOwotZGV2aWNlX2luaXRjYWxsX3N5bmMobXZfY3VzdF9tb2RfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjNTdiMDc2Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoQykgMjAxMCwgTWFydmVsbCBUZWNobm9sb2d5IEdyb3VwIEx0ZC4KLSogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSoKLSogVGhpcyBpcyBVTlBVQkxJU0hFRCBQUk9QUklFVEFSWSBTT1VSQ0UgQ09ERSBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXA7Ci0qIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IG5vdCBiZSBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcywgY29waWVkCi0qIG9yIGR1cGxpY2F0ZWQgaW4gYW55IGZvcm0sIGluIHdob2xlIG9yIGluIHBhcnQsIHdpdGhvdXQgdGhlIHByaW9yCi0qIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KLSoKLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgotKiBtb2RpZnkgdGhpcyBGaWxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdlbmVyYWwKLSogUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCi0qIGF2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKLSogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBvcgotKiBvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KLSoKLSogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAotKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCi0qIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKLSogZGlzY2xhaW1lci4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdl9jdXN0X25ldGRldi5jCi0qCi0qIERFU0NSSVBUSU9OOgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlIDxtdkNvbW1vbi5oPgotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgotI2luY2x1ZGUgPG5ldC9pcHY2Lmg+Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxtdk9zLmg+Ci0jaW5jbHVkZSA8Y3RybEVudi9tdkN0cmxFbnZMaWIuaD4KLQotI2luY2x1ZGUgIm12X2N1c3RfZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9uZXRkZXYuaCIKLSNpbmNsdWRlICJtdl9jdXN0X2Zsb3dfbWFwLmgiCi0jaW5jbHVkZSAibXZfY3VzdF9tbmdfaWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEV4dGVybmFsICBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogR2xvYmFsIHN0YXRpYyBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBZVVZBTCAtIHVwZGF0ZSB0byBwbmMgZGVmaW5lICovCi0jZGVmaW5lICAgICBNSF9HRU1fUE9SVF9NQVNLICAgICAgICAgICAgICAgICgweDBGRkYpCi0jZGVmaW5lICAgICBNSF9FUE9OX09BTV9UWVBFICAgICAgICAgICAgICAgICgweDg4MDkpCi0jZGVmaW5lICAgICBFVFlfSVBWNCAgICAgICAgICAgICAgICAgICAgICAgICgweDA4MDApCi0jZGVmaW5lICAgICBJUFY0X1BST1RPX09GRlNFVCAgICAgICAgICAgICAgICg5KQotI2RlZmluZSAgICAgTVZfQ1VTVF9TV0ZfVFhfUVVFVUUgICAgICAgICAgICAoNikKLQotI2RlZmluZSAgICAgQ1VTVF9UQkxfTlVNX0VOVFJJRVMoYSkgICAgICAgICAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKLQotLypTdGF0aWMgRGVjbGFyYXRpb25zICovCi1zdGF0aWMgaW50ICAgIG12X2V0aF9wb3J0c19udW0gICAgID0gMDsKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9kZWJ1Z19jb2RlICAgPSAwOwotCi1zdGF0aWMgaW50ICAgIG12X2N1c3Rfb21jaV9nZW1wb3J0ID0gMDsKLXN0YXRpYyBpbnQgICAgbXZfY3VzdF9vbWNpX3J4X2doICAgPSAwOwotc3RhdGljIGludCAgICBtdl9jdXN0X29hbV9yeF9naCAgICA9IDA7Ci0KLS8qIFByb3RvY29sIGRlZmluaXRpb25zICovCi1zdGF0aWMgc3RydWN0IG12X2V0aF90eF9zcGVjICAgICBvbWNpX21nbXRfdHhfc3BlYyA9IHswLCAwLCAwLCBNVl9DVVNUX1NXRl9UWF9RVUVVRX07Ci1zdGF0aWMgc3RydWN0IG12X2VvYW1fbGxpZF9zcGVjICBlcG9uX21nbXRfdHhfc3BlY1tNVl9DVVNUX05VTV9MTElEXTsKLSNkZWZpbmUgRVBPTl9NR01UX0VOVFJJRVMgICBDVVNUX1RCTF9OVU1fRU5UUklFUyhlcG9uX21nbXRfdHhfc3BlYykKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi1zdGF0aWMgc3RydWN0IG12X3BvcnRfdHhfc3BlYyAgICB1ZHBfcG9ydF9zcGVjX2NmZ1tDT05GSUdfTVZfRVRIX1BPUlRTX05VTV07Ci0jZGVmaW5lIFBPUlRfRU5UUklFUyAgICAgICAgQ1VTVF9UQkxfTlVNX0VOVFJJRVModWRwX3BvcnRfc3BlY19jZmcpCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotc3RhdGljIGludCAgICBtdl9jdXN0X2Zsb3dfbWFwID0gMDsKLSNlbmRpZgotCi0vKiBEZWZhdWx0IEFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgdXNlZCBmb3Igc29ja2V0IGFuZCBza2IgKi8KLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9JR01QICAgICAgKDB4QTAwMCkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9NTEQgICAgICAgKDB4QUIwMCkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9MUEJLICAgICAgKDB4RkZGQSkKLSNkZWZpbmUgTVZfQ1VTVF9FVEhfVFlQRV9PQU0gICAgICAgKDB4QkFCQSkKLS8qIFRoZSBFdGhlcm5ldCB0cHllIG9mIE9BTS9PTUNJIGNvdWxkIGJlIHNhbWUgc2luY2UgdGhleSB3aWxsIG5vdCB1c2UgYXQgdGhlIHNhbWUgdGltZSovCi0jZGVmaW5lIE1WX0NVU1RfRVRIX1RZUEVfT01DSSAgICAgICgweEJBQkEpCi0KLS8qIEdsb2JhbCBjdXN0IGNvbmZpZ3VyYXRpb24qLwotLyogUGF5IGF0dGVudGlvbiB0aGF0IHRoZSBvcmRlciBjb3VsZCBiZSBiZSBjaGFuZ2VkIGFuZCB0aGUgZW50cnkgY291bGQgbm90IGJlIHJlbW92ZWQgKi8KLXN0YXRpYyBtdl9jdXN0X2FwcF9jb25maWdfdCBnQ3VzdENvbmZpZ1tdID0KLXsKLSAgICAvKiBBcHBsaWNhdGlvbiBUeXBlICovICAgLyogRW5hYmxlIEZsYWcgKi8gICAvKkFwcGxpY2F0aW9uIEV0aCB0eXBlKi8gICAvKiBBcHBsaWNhdGlvbiBEZXNjcmlwdGlvbiovCi0gICAge01WX0NVU1RfQVBQX1RZUEVfSUdNUCwgIE1WX0NVU1RfQVBQX0RJU0FCTEUsIE1WX0NVU1RfRVRIX1RZUEVfSUdNUCwgICAgICJJR01QIGFwcGxpY2F0aW9uIn0sCi0gICAge01WX0NVU1RfQVBQX1RZUEVfTUxELCAgIE1WX0NVU1RfQVBQX0RJU0FCTEUsIE1WX0NVU1RfRVRIX1RZUEVfTUxELCAgICAgICJNTEQgYXBwbGljYXRpb24ifSwKLSAgICB7TVZfQ1VTVF9BUFBfVFlQRV9MUEJLLCAgTVZfQ1VTVF9BUFBfRElTQUJMRSwgTVZfQ1VTVF9FVEhfVFlQRV9MUEJLLCAgICAgIkxvb3BiYWNrIGRldGVjdGlvbiBhcHBsaWNhdGlvbiJ9LAotICAgIHtNVl9DVVNUX0FQUF9UWVBFX09BTSwgICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX09BTSwgICAgICAiZU9BTSBhcHBsaWNhdGlvbiJ9LAotICAgIHtNVl9DVVNUX0FQUF9UWVBFX09NQ0ksICBNVl9DVVNUX0FQUF9ESVNBQkxFLCBNVl9DVVNUX0VUSF9UWVBFX09NQ0ksICAgICAiT01DSSBhcHBsaWNhdGlvbiJ9LCAgICAKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBtdl9jdXN0X2RlYnVnX2luZm9fc2V0KGludCB2YWwpCi17Ci0gICAgbXZfY3VzdF9kZWJ1Z19jb2RlID0gdmFsOwotICAgIHJldHVybjsKLX0KLQotCi12b2lkIG12X2N1c3RfYXBwX2ZsYWdfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZW5hYmxlKQotewotICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXMoKSBJbiwgYXBwX3R5cGVbJWRdLCBlbmFibGVbJWRdIFxuIiwgX19mdW5jX18sIGFwcF90eXBlLCBlbmFibGUpOwotICAgIAotICAgIGlmIChhcHBfdHlwZSA+IChNVl9DVVNUX0FQUF9UWVBFX01BWC0xKSkKLSAgICB7Ci0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgYXBwbGljYXRpb24gdHlwZVslZF0sIGFsbG93ZWQgbWF4IHR5cGVbJWRdICBcbiIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGFwcF90eXBlLCBNVl9DVVNUX0FQUF9UWVBFX01BWC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhcHBfdHlwZSA9PSBNVl9DVVNUX0FQUF9UWVBFX09NQ0kpCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5lbmFibGUpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIkVQT04gaXMgYWxyZWFkeSB2YWxpZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAxOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9ESVNBQkxFOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICAgICAgbXZfY3VzdF9mbG93X21hcCAgID0gMDsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYoYXBwX3R5cGUgPT0gTVZfQ1VTVF9BUFBfVFlQRV9PQU0pCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVkNVU1RfRVJSX1BSSU5UKCJHUE9OIGlzIGFscmVhZHkgdmFsaWRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT0FNXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmVuYWJsZSA9IE1WX0NVU1RfQVBQX0RJU0FCTEU7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgICAgICAgICBtdl9jdXN0X2Zsb3dfbWFwICAgPSAwOwotI2VuZGlmCi0gICAgICAgIH0KLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9FTkFCTEU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5lbmFibGUgPSBNVl9DVVNUX0FQUF9ESVNBQkxFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9hcHBfZmxhZ19zZXQpOwotCi0KLXZvaWQgbXZfY3VzdF9hcHBfZXR5cGVfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZXRoX3R5cGUpCi17Ci0gICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlcygpIEluLCBhcHBfdHlwZVslZF0sIGV0aF90eXBlWyVkXSBcbiIsIF9fZnVuY19fLCBhcHBfdHlwZSwgZXRoX3R5cGUpOwotICAgIAotICAgIGlmIChhcHBfdHlwZSA+IChNVl9DVVNUX0FQUF9UWVBFX01BWC0xKSkKLSAgICB7Ci0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgYXBwbGljYXRpb24gdHlwZVslZF0sIGFsbG93ZWQgbWF4IHR5cGVbJWRdICBcbiIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIGFwcF90eXBlLCBNVl9DVVNUX0FQUF9UWVBFX01BWC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdDdXN0Q29uZmlnW2FwcF90eXBlXS5ldGhfdHlwZSA9IGV0aF90eXBlOwotCi0gICAgcmV0dXJuOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X2FwcF9ldHlwZV9zZXQpOwotCi0KLXZvaWQgbXZfY3VzdF9yZWNfc2tiKGludCBwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotICAgIHVpbnQzMl90IHJ4X3N0YXR1czsKLSAgICBzdHJ1Y3QgZXRoX3BvcnQgKnBwOwotCi0gICAgcnhfc3RhdHVzID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKLSAgICBwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHBvcnQpOwotICAgIFNUQVRfREJHKGlmIChyeF9zdGF0dXMpIChwcC0+c3RhdHMucnhfZHJvcF9zdysrKSk7Ci19Ci0KLXZvaWQgbXZfY3VzdF9vbWNpX3J4X2doX3NldChpbnQgdmFsKQotewotICAgIG12X2N1c3Rfb21jaV9yeF9naCA9IHZhbDsKLSAgICByZXR1cm47Ci19Ci0KLWludCBtdl9jdXN0X29tY2lfdHhfc2V0KGludCB0Y29udCwgaW50IHR4cSkKLXsKLSAgICBpZiAobXZOZXRhVHhwQ2hlY2soTVZfUE9OX1BPUlRfSUQsIHRjb250KSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBpZiAodHhxPDAgfHwgdHhxPkNPTkZJR19NVl9FVEhfVFhRKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cCA9IHRjb250OwotICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cSA9IHR4cTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIG12X2N1c3Rfb21jaV9nZW1wb3J0X3NldChpbnQgZ2VtcG9ydCkKLXsKLSAgICBtdl9jdXN0X29tY2lfZ2VtcG9ydCA9IGdlbXBvcnQ7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkIG12X2N1c3Rfb21jaV9od19jbWRfc2V0KHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBvbWNpX21nbXRfdHhfc3BlYy5od19jbWQgPSBod19jbWQ7Ci19Ci0KLWludCBtdl9jdXN0X29tY2lfc2V0KGludCB0Y29udCwgaW50IHR4cSwgaW50IGdlbV9wb3J0LCBpbnQga2VlcF9yeF9taCkKLXsKLSAgICBpbnQgcmV0LCBod19jbWQ7Ci0KLSAgICBvbWNpX21nbXRfdHhfc3BlYy50eF9mdW5jID0gTlVMTDsKLSAgICBvbWNpX21nbXRfdHhfc3BlYy5mbGFncyA9IE1WX0VUSF9GX05PX1BBRCB8IE1WX0VUSF9GX01IOwotCi0gICAgcmV0ID0gbXZfY3VzdF9vbWNpX3R4X3NldCh0Y29udCwgdHhxKTsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIE1WQ1VTVF9FUlJfUFJJTlQoIm12X2N1c3Rfb21jaV90eF9zZXQgLSByZXQoJWQpICBcbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgbXZfY3VzdF9vbWNpX2dlbXBvcnRfc2V0KGdlbV9wb3J0KTsKLSAgICBod19jbWQgPSAoKGdlbV9wb3J0IDw8IDgpIHwgMHgwMDEwKTsKLSAgICBtdl9jdXN0X29tY2lfaHdfY21kX3NldChod19jbWQpOwotICAgIG12X2N1c3Rfb21jaV9yeF9naF9zZXQoa2VlcF9yeF9taCk7Ci0KLSAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChNVl9DVVNUX0FQUF9UWVBFX09NQ0ksIE1WX0NVU1RfQVBQX0VOQUJMRSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wobXZfY3VzdF9vbWNpX3NldCk7Ci0KLXZvaWQgbXZfY3VzdF9vbWNpX3ByaW50KHZvaWQpCi17Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIE9NQ0kgQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIk9NQ0k6IHZhbGlkID0gJWQsIGdlbXBvcnQgPSAlZCwgZXRodHlwZSA9IDB4JTA0eCwgZ2hfa2VlcCA9ICVkXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSwKLSAgICAgICAgICAgbXZfY3VzdF9vbWNpX2dlbXBvcnQsIAotICAgICAgICAgICBudG9ocyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmV0aF90eXBlKSwgCi0gICAgICAgICAgIG12X2N1c3Rfb21jaV9yeF9naCk7Ci0gICAgcHJpbnRrKCJPTUNJOiB0eHAgICA9ICVkLCB0eHEgPSAlZCwgaHdfY21kID0gMHglMDh4LCBmbGFncyA9IDB4JTA0eCBvbiBUWCBcbiIsCi0gICAgICAgICAgIG9tY2lfbWdtdF90eF9zcGVjLnR4cCwgb21jaV9tZ210X3R4X3NwZWMudHhxLCBvbWNpX21nbXRfdHhfc3BlYy5od19jbWQsIG9tY2lfbWdtdF90eF9zcGVjLmZsYWdzKTsKLSAgICBwcmludGsoIlxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9vbWNpX2dlbV9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGdoOwotCi0gICAgZ2ggPSBudG9ocygqKHVpbnQxNl90ICopZGF0YSk7Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6Z2g9IDB4KCUwNHgpIC0gbXZfY3VzdF9vbWNpX2dlbXBvcnQ9IDB4KCUwNHgpICBcbiIsIF9fZnVuY19fLCBnaCwgbXZfY3VzdF9vbWNpX2dlbXBvcnQpOwotCi0gICAgLyogQ29tcGFyZSBHSCBmb3Igb21jaV9nZW1wb3J0ICovCi0gICAgaWYgKCAoZ2ggJiBNSF9HRU1fUE9SVF9NQVNLKSAhPSBtdl9jdXN0X29tY2lfZ2VtcG9ydCApIHsKLSAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgcHJpbnRrKCIlczogY29tcGFyZSBHSCBmb3IgT01DSV9nZW1wb3J0IGZhaWxlZDogZ2g9IDB4KCUwNHgpIC0gbXZfY3VzdF9vbWNpX2dlbXBvcnQ9IDB4KCUwNHgpICBcbiIsIF9fZnVuY19fLCBnaCwgbXZfY3VzdF9vbWNpX2dlbXBvcnQpOwotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDEpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3Rfb21jaV9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9vbWNpX2dlbV9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAobXZfY3VzdF9vbWNpX3J4X2doKSB7Ci0gICAgICAgIHJ4X2J5dGVzID0gcnhfZGVzYy0+ZGF0YVNpemU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBza2ItPmRhdGEgKz0gTVZfRVRIX01IX1NJWkU7Ci0gICAgICAgIHJ4X2J5dGVzID0gcnhfZGVzYy0+ZGF0YVNpemUgLSBNVl9FVEhfTUhfU0laRTsKLSAgICB9Ci0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PTUNJXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3Rfb21jaV90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIGlmICgoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmV0aF90eXBlKSkKLSAgICAgICAgJiYgKE1WX0NVU1RfQVBQX0VOQUJMRSA9PSBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09NQ0ldLmVuYWJsZSkKLSAgICAgICAgJiYgKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpKSB7Ci0gICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICZvbWNpX21nbXRfdHhfc3BlYywgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOwotICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICBwcmludGsoIiVzIiwgX19mdW5jX18pOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBtdl9jdXN0X29hbV9yeF9naF9zZXQoaW50IHZhbCkKLXsKLSAgICBtdl9jdXN0X29hbV9yeF9naCA9IHZhbDsKLSAgICByZXR1cm47Ci19Ci0KLWludCBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoaW50IGxsaWQsIHVpbnQ4X3QgKmxsaWRfbWFjLCBpbnQgdHhxKQotewotCi0gICAgaWYgKG12TmV0YVR4cENoZWNrKE1WX1BPTl9QT1JUX0lELCBsbGlkKSkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBpZiAodHhxPDAgfHwgdHhxPkNPTkZJR19NVl9FVEhfVFhRKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgaWYgKCFsbGlkX21hYykgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgbWVtY3B5KCh2b2lkICopICYoZXBvbl9tZ210X3R4X3NwZWNbbGxpZF0ubGxpZF9tYWNfYWRkcmVzcyksICh2b2lkICopIGxsaWRfbWFjLCBFVEhfQUxFTik7Ci0KLSAgICBlcG9uX21nbXRfdHhfc3BlY1tsbGlkXS50eF9zcGVjLnR4cSA9IHR4cTsKLQotICAgIHJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X2VvYW1fbGxpZF9zZXQpOwotCi12b2lkIG12X2N1c3RfZW9hbV9pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDtpIDwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICBtZW1zZXQoJmVwb25fbWdtdF90eF9zcGVjW2ldLDAsIHNpemVvZihzdHJ1Y3QgbXZfZW9hbV9sbGlkX3NwZWMpKTsKLQotICAgICAgICAvKiBFYWNoIHRhYmxlIGVudHJ5IChpKSBhLXByaW9yaSBjb3JyZXNwb25kcyB0byBMTElEIChpKSAqLwotICAgICAgICBlcG9uX21nbXRfdHhfc3BlY1tpXS50eF9zcGVjLnR4cCA9IGk7Ci0KLSAgICAgICAgLyogVGhlIG12X25ldGEgZHJpdmVyIHdpbGwgYWRkIHRoZSBkZWZhdWx0IE1ILiBUaGUgTUggdmFsdWUgaGFzIG5vIHNpZ25pZmljYW5jZSBpbiBFUE9OIFVwc3RyZWFtICovCi0gICAgICAgIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MgPSBNVl9FVEhfRl9NSDsKLSAgICB9Ci0KLSAgICAvKiBJbiBSeCwga2VlcCB0aGUgTUggZm9yIEVPQU0gKi8KLSAgICBtdl9jdXN0X29hbV9yeF9naF9zZXQoMSk7Ci0gICAgcmV0dXJuIDsKLX0KLQotdm9pZCBtdl9jdXN0X2VvYW1fcHJpbnQodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogZU9BTSBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiRU9BTTogdmFsaWQgPSAlZCwgZXRodHlwZSA9IDB4JTA0eCwgZ2hfa2VlcCA9ICVkXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlLCAKLSAgICAgICAgICAgbnRvaHMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKSwgCi0gICAgICAgICAgIG12X2N1c3Rfb2FtX3J4X2doKTsKLSAgICBmb3IgKGk9MDtpIDwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICBwcmludGsoImxsaWQlZDogbWFjPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LCB0eHA9JWQsIHR4cT0lZCwgaHdfY21kPTB4JTA4eCwgZmxhZ3MgPSAweCUwNHhcbiIsCi0gICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1swXSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzFdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1syXSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzNdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1s0XSxlcG9uX21nbXRfdHhfc3BlY1tpXS5sbGlkX21hY19hZGRyZXNzWzVdLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0udHhfc3BlYy50eHAsIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMudHhxLAotICAgICAgICAgICAgICAgZXBvbl9tZ210X3R4X3NwZWNbaV0udHhfc3BlYy5od19jbWQsIGVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MpOwotICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZW9hbV90eXBlX3BhcnNlKHVpbnQ4X3QgKmRhdGEpCi17Ci0gICAgdWludDE2X3QgZXR5OwotCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKShkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOKSk7Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6IGV0eSAweCglMDR4KVxuIiwgX19mdW5jX18sIGV0eSk7Ci0KLSAgICAvKiBDb21wYXJlIEVQT04gT0FNIGV0aGVyX3R5cGUgKi8KLSAgICBpZiAoZXR5ID09IE1IX0VQT05fT0FNX1RZUEUpCi0gICAgICAgIHJldHVybigxKTsKLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2Vwb25fb2FtX3J4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKQotewotICAgIHVpbnQzMl90IHJ4X2J5dGVzOwotCi0gICAgaWYgKCFtdl9jdXN0X2VvYW1fdHlwZV9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChtdl9jdXN0X29hbV9yeF9naCkgewotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc2tiLT5kYXRhICs9IE1WX0VUSF9NSF9TSVpFOwotICAgICAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplIC0gTVZfRVRIX01IX1NJWkU7Ci0gICAgfQotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKTsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCi0gICAgc2tiLT5kZXYgPSBkZXY7Ci0jZW5kaWYKLSAgICBtdl9jdXN0X3JlY19za2IocG9ydCwgc2tiKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9lb2FtX3R4KGludCBwb3J0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKnR4X3NwZWNfb3V0KQotewotICAgIGludCBtYWNfbWF0Y2gsIGk7Ci0KLSAgICBpZiAoKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9PQU1dLmV0aF90eXBlKSkKLSAgICAgICAgJiYgKE1WX0NVU1RfQVBQX0VOQUJMRSA9PSBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlKQotICAgICAgICAmJiBwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSB7Ci0gICAgICAgIC8qIExvb2t1cCBNQUMgQWRkcmVzcyAqLwotICAgICAgICBmb3IgKGk9MDsgaTwoRVBPTl9NR01UX0VOVFJJRVMpO2krKykgewotICAgICAgICAgICAgbWFjX21hdGNoID0gbWVtY21wKCh2b2lkICopICYoZXBvbl9tZ210X3R4X3NwZWNbaV0ubGxpZF9tYWNfYWRkcmVzc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoc2tiLT5kYXRhICsgLypNVl9FVEhfTUhfU0laRSArKi8gRVRIX0FMRU4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVUSF9BTEVOKTsKLSAgICAgICAgICAgIGlmICghbWFjX21hdGNoKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5ICh0eF9zcGVjX291dCwgJmVwb25fbWdtdF90eF9zcGVjW2ldLnR4X3NwZWMsIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMsIGxsaWQgPSAlZCIsIF9fZnVuY19fLCBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBTb3VyY2UgTUFDIEFkZHJlc3Mgbm90IGZvdW5kICovCi0gICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCIoJXMpSW5wdXQgUGFja2V0IGZpcnN0IGJ5dGVzOlxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgZm9yIChpPTA7aTwyNDtpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSU4PT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJcbiIpOwotICAgICAgICAgICAgICAgIHByaW50ayAoIiUwMnggIiwgKihza2ItPmRhdGEgKyBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0lHTVBfSEFORExFCi12b2lkIG12X2N1c3RfaWdtcF9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBJR01QIENvbmZpZ3VyYXRpb24gKioqKioqKioqKioqKioqKipcblxuIik7Ci0gICAgcHJpbnRrKCJJR01QIHZhbGlkID0gJWQsICBldGh0eXBlID0gMHglMDR4IFxuIiwKLSAgICAgICAgICAgZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUsIAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0lHTVBdLmV0aF90eXBlKTsKLSAgICBwcmludGsoIklHTVAgZGVmYXVsdCB0eHEgPSAlZFxuIixNVl9DVVNUX1NXRl9UWF9RVUVVRSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfaWdtcF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICBwcm90bzsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIHdoaWxlIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDkxMDAgfHwgZXR5ID09IDB4ODhBOCkgewotICAgICAgICBmaWVsZHArPSBWTEFOX0hMRU47Ci0gICAgICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIH0KLQotICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlczpldHkgMHgoJTA0eClcbiIsIF9fZnVuY19fLCBldHkpOwotCi0gICAgaWYgKGV0eSA9PSBFVFlfSVBWNCkgewotICAgICAgICBmaWVsZHArPSAyOwotICAgICAgICBmaWVsZHArPSBJUFY0X1BST1RPX09GRlNFVDsKLSAgICAgICAgcHJvdG8gPSAqZmllbGRwOwotICAgICAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgcHJpbnRrKCIlczpwcm90byAweCglMDJ4KVxuIiwgX19mdW5jX18sIHByb3RvKTsKLQotICAgICAgICBpZiAocHJvdG8gPT0gSVBQUk9UT19JR01QKQotICAgICAgICAgICAgcmV0dXJuKDEpOwotICAgIH0KLQotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X2lnbXBfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDMyX3QgcnhfYnl0ZXM7Ci0KLSAgICBpZiAoIW12X2N1c3RfaWdtcF9wYXJzZShza2ItPmRhdGEpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIFRvIEluZGljYXRlIHRoZSBzb3VyY2UgR01BQyAqLwotICAgIHNrYi0+ZGF0YVswXSA9IHBvcnQ7Ci0KLSAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfaWdtcF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgIC8qIENoZWNrIGFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgKi8KLSAgICAgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5ldGhfdHlwZSkpIHsKLQotICAgICAgICAgICAgLyogVGhlIE1hcHBpbmcgYW5kIFZMQU4gbW9kIHNob3VsZCBiZSBzdXBwb3J0IGluIG5leHQgcGhhc2UgKi8KLSAgICAgICAgICAgIGlmIChNVl9QT05fUE9SVF9JRCA9PSBwb3J0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IE1WX0VUSF9GX01IOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gMDsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gTVZfQ1VTVF9TV0ZfVFhfUVVFVUU7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9IDA7Ci0jaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfTUxEX0hBTkRMRQotdm9pZCBtdl9jdXN0X21sZF9wcmludCh2b2lkKQotewotICAgIHByaW50aygiKioqKioqKioqKioqKiBNTEQgQ29uZmlndXJhdGlvbiAqKioqKioqKioqKioqKioqKlxuXG4iKTsKLSAgICBwcmludGsoIk1MRCB2YWxpZCA9ICVkLCAgZXRodHlwZSA9IDB4JTA0eCBcbiIsCi0gICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTUxEXS5lbmFibGUsIAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZXRoX3R5cGUpOwotICAgIHByaW50aygiTUxEIGRlZmF1bHQgdHhxID0gJWRcbiIsTVZfQ1VTVF9TV0ZfVFhfUVVFVUUpOwotICAgIHByaW50aygiXG4iKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X21sZF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0KLSAgICAvKiBMb29wIHRocm91Z2ggVkxBTiB0YWdzICovCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgd2hpbGUgKGV0eSA9PSAweDgxMDAgfHwgZXR5ID09IDB4OTEwMCB8fGV0eSA9PSAweDg4QTgpIHsKLSAgICAgICAgZmllbGRwKz0gVkxBTl9ITEVOOwotICAgICAgICBldHkgPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLSAgICB9Ci0KLSAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgIHByaW50aygiJXM6ZXR5IDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgZXR5KTsKLQotICAgIGlmIChldHkgPT0gRVRIX1BfSVBWNikgCi0gICAgewotICAgICAgICBzdHJ1Y3QgaXB2NmhkciAqaGRyID0gKHN0cnVjdCBpcHY2aGRyICopKGZpZWxkcCsyKTsKLSAgICAgICAgc3RydWN0IGlwdjZfaG9wb3B0X2hkciAqaG9wb3B0aGRyIDsKLSAgICAgICAgc3RydWN0IGljbXA2aGRyICpwaWM7Ci0KLSAgICAgICAgaWYgKGhkci0+bmV4dGhkciAhPSBORVhUSERSX0hPUCApCi0gICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgaG9wb3B0aGRyID0gKHN0cnVjdCBpcHY2X2hvcG9wdF9oZHIgKikoKHVpbnQ4X3QgKiloZHIrIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwotCi0gICAgICAgIGlmICggaG9wb3B0aGRyLT5uZXh0aGRyICE9IElQUFJPVE9fSUNNUFY2KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgcGljID0gIChzdHJ1Y3QgaWNtcDZoZHIgKikoKHVpbnQ4X3QgKilob3BvcHRoZHIraXB2Nl9vcHRsZW4oaG9wb3B0aGRyKSk7Ci0KLSAgICAgICAgc3dpdGNoIChwaWMtPmljbXA2X3R5cGUpIHsKLSAgICAgICAgY2FzZSBJQ01QVjZfTUdNX1FVRVJZOgotICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVQT1JUOgotICAgICAgICBjYXNlIElDTVBWNl9NR01fUkVEVUNUSU9OOgotICAgICAgICBjYXNlIElDTVBWNl9NTEQyX1JFUE9SVDoKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHJldHVybigwKTsKLX0KLQotc3RhdGljIGludCBtdl9jdXN0X21sZF9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9tbGRfcGFyc2Uoc2tiLT5kYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBUbyBJbmRpY2F0ZSB0aGUgc291cmNlIEdNQUMgKi8KLSAgICBza2ItPmRhdGFbMF0gPSBwb3J0OwotCi0gICAgcnhfYnl0ZXMgPSByeF9kZXNjLT5kYXRhU2l6ZTsKLQotICAgIHNrYi0+dGFpbCArPSByeF9ieXRlczsKLSAgICBza2ItPmxlbiA9IHJ4X2J5dGVzOwotICAgIHNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGh0b25zKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTUxEXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0KLSAgICBtdl9jdXN0X3JlY19za2IocG9ydCwgc2tiKTsKLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9tbGRfdHgoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9NTERdLmVuYWJsZSA9PSBNVl9DVVNUX0FQUF9FTkFCTEUpIHsKLSAgICAgICAgLyogQ2hlY2sgYXBwbGljYXRpb24gRXRoZXJuZXQgdHlwZSAqLwotICAgICAgICBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZXRoX3R5cGUpKSB7Ci0KLSAgICAgICAgICAgIC8qIFRoZSBNYXBwaW5nIGFuZCBWTEFOIG1vZCBzaG91bGQgYmUgc3VwcG9ydCBpbiBuZXh0IHBoYXNlICovCi0gICAgICAgICAgICBpZiAoTVZfUE9OX1BPUlRfSUQgPT0gcG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSBNVl9FVEhfRl9NSDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IDA7Ci0gICAgICAgICAgICB0eF9zcGVjX291dC0+dHhxICAgICA9IE1WX0NVU1RfU1dGX1RYX1FVRVVFOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAwOwotI2lmZGVmIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotI2VuZGlmCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotdm9pZCBtdl9jdXN0X2xvb3BkZXRfcHJpbnQodm9pZCkKLXsKLSAgICBwcmludGsoIioqKioqKioqKioqKiogVU5JIGxvb3BiYWNrIGRldGVjdGlvbiBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiTHBiayBkZXRlY3QgdmFsaWQgPSAlZCwgIGV0aHR5cGUgPSAweCUwNHggXG4iLAotICAgICAgICAgICBnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX0xQQktdLmVuYWJsZSwgCi0gICAgICAgICAgIGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZXRoX3R5cGUpOwotICAgIHByaW50aygiTHBiayBkZXRlY3QgZGVmYXVsdCB0eHEgPSAlZFxuIixNVl9DVVNUX1NXRl9UWF9RVUVVRSk7Ci0gICAgcHJpbnRrKCJcbiIpOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfbG9vcGRldF9wYXJzZSh1aW50OF90ICpkYXRhKQotewotICAgIHVpbnQxNl90IGV0eTsKLSAgICB1aW50OF90ICpmaWVsZHAgPSBkYXRhICsgTVZfRVRIX01IX1NJWkUgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIHdoaWxlIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDkxMDAgfHxldHkgPT0gMHg4OEE4KSB7Ci0gICAgICAgIGZpZWxkcCs9IFZMQU5fSExFTjsKLSAgICAgICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgfQotICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgcHJpbnRrKCIlczogZXR5IDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgZXR5KTsKLQotICAgIC8qIENvbXBhcmUgRVBPTiBPQU0gZXRoZXJfdHlwZSAqLwotICAgIGlmIChldHkgPT0gZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSkKLSAgICAgICAgcmV0dXJuKDEpOwotCi0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfbG9vcGRldF9yeChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCByeF9ieXRlczsKLQotICAgIGlmICghbXZfY3VzdF9sb29wZGV0X3BhcnNlKHNrYi0+ZGF0YSkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIC8qIFRvIEluZGljYXRlIHRoZSBzb3VyY2UgR01BQyAqLwotICAgIHNrYi0+ZGF0YVswXSA9IHBvcnQ7Ci0KLSAgICByeF9ieXRlcyA9IHJ4X2Rlc2MtPmRhdGFTaXplOwotCi0gICAgc2tiLT50YWlsICs9IHJ4X2J5dGVzOwotICAgIHNrYi0+bGVuID0gcnhfYnl0ZXM7Ci0gICAgc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLSAgICBza2ItPnByb3RvY29sID0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSk7Ci0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQotICAgIHNrYi0+ZGV2ID0gZGV2OwotI2VuZGlmCi0gICAgbXZfY3VzdF9yZWNfc2tiKHBvcnQsIHNrYik7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotaW50IG12X2N1c3RfbG9vcGRldF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG12X2V0aF90eF9zcGVjICp0eF9zcGVjX291dCkKLXsKLSAgICBpZiAoTVZfQ1VTVF9BUFBfRU5BQkxFID09IGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfTFBCS10uZW5hYmxlKSB7Ci0gICAgICAgIC8qIENoZWNrIGFwcGxpY2F0aW9uIEV0aGVybmV0IHR5cGUgKi8KLSAgICAgICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5ldGhfdHlwZSkpIHsKLSAgICAgICAgIAotICAgICAgICAgICAgaWYgKE1WX1BPTl9QT1JUX0lEID09IHBvcnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gTVZfRVRIX0ZfTUg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cCAgICAgPSAwOwotICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBNVl9DVVNUX1NXRl9UWF9RVUVVRTsKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gMDsKLSNpZmRlZiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwKLSAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSNlbmRpZiAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdl9jdXN0X2NvcHlfdHhfc3BlYyhzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgKiB0eF9zcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHR4X3NwZWMtPnR4cCA9IHR4cDsKLSAgICB0eF9zcGVjLT50eHEgPSB0eHE7Ci0gICAgdHhfc3BlYy0+aHdfY21kID0gaHdfY21kOwotICAgIHR4X3NwZWMtPmZsYWdzID0gZmxhZ3M7Ci19Ci0KLWludCBtdl9jdXN0X3VkcF9zcGVjX3ByaW50KGludCBwb3J0KQotewotICAgIGludCBpOwotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZChwb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWM7Ci0KLSAgICBpZiAoIXBwKQotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLQotICAgIHVkcF9zcGVjID0gJih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTsKLQotICAgIHByaW50aygiXG4qKioqIHBvcnQgIyVkIC0gVFggVURQIERlc3QgUG9ydCBjb25maWd1cmF0aW9uICoqKioqXG4iLCBwb3J0KTsKLSAgICBwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgIHByaW50aygiSUQgdWRwX2RzdCAgIHR4cCAgICB0eHEgICAgZmxhZ3MgICAgaHdfY21kICAgICBmdW5jX2FkZFxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX2RzdFswXSk7IGkrKykgewotICAgICAgICBpZiAodWRwX3NwZWNbaV0udHhfc3BlYy50eHEgIT0gTVZfRVRIX1RYUV9JTlZBTElEKQotICAgICAgICAgICAgcHJpbnRrKCIlMmQgICAlMDRkICAgICAgJWQgICAgICAlZCAgICAgMHglMDR4ICAgMHglMDh4ICAgMHglcFxuIiwKLSAgICAgICAgICAgICAgICAgICBpLCBudG9ocyh1ZHBfc3BlY1tpXS51ZHBfcG9ydCksCi0gICAgICAgICAgICAgICAgICAgdWRwX3NwZWNbaV0udHhfc3BlYy50eHAsIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMuZmxhZ3MsIHVkcF9zcGVjW2ldLnR4X3NwZWMuaHdfY21kLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhfZnVuYyk7Ci0gICAgfQotICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCi0gICAgdWRwX3NwZWMgPSAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOwotCi0gICAgcHJpbnRrKCIqKioqIHBvcnQgIyVkIC0gVFggVURQIFNvdXJjZSBQb3J0IGNvbmZpZ3VyYXRpb24gKioqKipcbiIsIHBvcnQpOwotICAgIHByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgIHByaW50aygiSUQgdWRwX3NyYyAgIHR4cCAgICB0eHEgICAgIGZsYWdzICAgIGh3X2NtZCAgICAgZnVuY19hZGRcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyYykvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmNbMF0pOyBpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkKLSAgICAgICAgICAgIHByaW50aygiJTJkICAgJTA0ZCAgICAgICVkICAgICAgJWQgICAgIDB4JTA0eCAgIDB4JTA4eCAgIDB4JXBcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgbnRvaHModWRwX3NwZWNbaV0udWRwX3BvcnQpLAotICAgICAgICAgICAgICAgICAgIHVkcF9zcGVjW2ldLnR4X3NwZWMudHhwLCB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLmZsYWdzLCB1ZHBfc3BlY1tpXS50eF9zcGVjLmh3X2NtZCwKLSAgICAgICAgICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4X2Z1bmMpOwotICAgIH0KLSAgICBwcmludGsoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi0KLXZvaWQgbXZfY3VzdF91ZHBfc3BlY19wcmludF9hbGwodm9pZCkKLXsKLSAgICBpbnQgcG9ydDsKLQotICAgIGZvciAocG9ydD0wO3BvcnQgPCBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSA7cG9ydCsrKSB7Ci0gICAgICAgIG12X2N1c3RfdWRwX3NwZWNfcHJpbnQocG9ydCk7Ci0gICAgfQotfQotCi1NVl9TVEFUVVMgIG12X2N1c3RfdWRwX2ludF9zcGVjX3NldChzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NwZWMsIHVpbnQxNl90IHVkcF9wb3J0LCBpbnQgdGFibGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIC8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RzICovCi0gICAgZm9yIChpPTA7IGkgPCB0YWJsZV9zaXplO2krKykgewotICAgICAgICBpZiAodWRwX3NwZWNbaV0udWRwX3BvcnQgPT0gaHRvbnModWRwX3BvcnQpICYmCi0gICAgICAgICAgICB1ZHBfc3BlY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIG12X2N1c3RfY29weV90eF9zcGVjKCYodWRwX3NwZWNbaV0udHhfc3BlYyksIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKLSAgICAgICAgICAgIHJldHVybiBNVl9PSzsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDaGVjayBlbXB0eSAqLwotICAgIGZvciAoaT0wOyBpIDwgdGFibGVfc2l6ZTtpKyspIHsKLSAgICAgICAgaWYgKHVkcF9zcGVjW2ldLnR4X3NwZWMudHhxID09IE1WX0VUSF9UWFFfSU5WQUxJRCkgewotICAgICAgICAgICAgdWRwX3NwZWNbaV0udWRwX3BvcnQgPSBodG9ucyh1ZHBfcG9ydCk7Ci0gICAgICAgICAgICBtdl9jdXN0X2NvcHlfdHhfc3BlYygmKHVkcF9zcGVjW2ldLnR4X3NwZWMpLCB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0gICAgICAgICAgICByZXR1cm4gTVZfT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oTVZfRlVMTCk7Ci19Ci0KLQotTVZfU1RBVFVTICBtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX3NyY19zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyYzsKLSAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOwotCi0gICAgaWYgKCFwcCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBtdl9zdGF0dXMgPSBtdl9jdXN0X3VkcF9pbnRfc3BlY19zZXQodWRwX3NyY19zcGVjLCB1ZHBfc3JjX3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjKS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX3NyY1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4cCwgdHhxLCBmbGFncywgaHdfY21kKTsKLQotICAgIGlmIChtdl9zdGF0dXMgIT0gTVZfT0spCi0gICAgICAgIHByaW50aygiJXM6IFVEUCBTcGVjaWFsIFNvdXJjZSBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKLQotICAgIHJldHVybihtdl9zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQpOwotCi0KLU1WX1NUQVRVUyAgbXZfY3VzdF91ZHBfZGVzdF9zcGVjX3NldChpbnQgdHhfcG9ydCwgdWludDE2X3QgdWRwX2Rlc3RfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKQotewotICAgIHN0cnVjdCBldGhfcG9ydCAqcHAgPSBtdl9ldGhfcG9ydF9ieV9pZCh0eF9wb3J0KTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyAqdWRwX2RzdF9zcGVjID0gdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdDsKLSAgICBNVl9TVEFUVVMgbXZfc3RhdHVzOwotCi0gICAgaWYgKCFwcCkKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KLSAgICBtdl9zdGF0dXMgPSBtdl9jdXN0X3VkcF9pbnRfc3BlY19zZXQodWRwX2RzdF9zcGVjLCB1ZHBfZGVzdF9wb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdCkvc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9kc3RbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHAsIHR4cSwgZmxhZ3MsIGh3X2NtZCk7Ci0KLSAgICBpZiAobXZfc3RhdHVzICE9IE1WX09LKQotICAgICAgICBwcmludGsoIiVzOiBVRFAgU3BlY2lhbCBEZXN0LiBQb3J0IFRhYmxlIGlzIGZ1bGxcbiIsIF9fZnVuY19fKTsKLQotICAgIHJldHVybihtdl9zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChtdl9jdXN0X3VkcF9kZXN0X3NwZWNfc2V0KTsKLQotCi12b2lkICBtdl9jdXN0X3VkcF90YWJsZV9kZWwodm9pZCkKLXsKLSAgICBpbnQgbnVtX3BvcnRzID0gUE9SVF9FTlRSSUVTOwotICAgIGludCB0eF9wb3J0LCBpOwotCi0gICAgaWYgKG51bV9wb3J0cyA+IG12X2V0aF9wb3J0c19udW0pCi0gICAgICAgIG51bV9wb3J0cyA9IG12X2V0aF9wb3J0c19udW07Ci0KLQotICAgIGZvciAodHhfcG9ydD0wOyB0eF9wb3J0PG51bV9wb3J0czt0eF9wb3J0KyspIHsKLQotICAgICAgICAvKiBJbnZhbGlkYXRlIFVEUCBEZXN0IHBvcnRzLCBzZXQgdHhxPWludmFsaWQgICovCi0gICAgICAgIGZvciAoaT0wO2k8KHNpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfZHN0KS9zaXplb2YodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFswXSkpO2krKykgewotICAgICAgICAgICAgbWVtc2V0KCYodWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXSksIDAsIHNpemVvZihzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYykpOwotICAgICAgICAgICAgdWRwX3BvcnRfc3BlY19jZmdbdHhfcG9ydF0udWRwX2RzdFtpXS50eF9zcGVjLnR4cSA9IE1WX0VUSF9UWFFfSU5WQUxJRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEludmFsaWRhdGUgVURQIFNvdXJjZSBwb3J0cywgLCBzZXQgdHhxPWludmFsaWQgKi8KLSAgICAgICAgZm9yIChpPTA7aTwoc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3R4X3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjWzBdKSk7aSsrKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJih1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldKSwgMCwgc2l6ZW9mKHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjKSk7Ci0gICAgICAgICAgICB1ZHBfcG9ydF9zcGVjX2NmZ1t0eF9wb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxID0gTVZfRVRIX1RYUV9JTlZBTElEOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuOwotfQotCi1pbnQgbXZfY3VzdF91ZHBfcG9ydF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgc3RydWN0IGlwaGRyICAqIGlwaGRycCAgID0gTlVMTDsKLSAgICBzdHJ1Y3QgdWRwaGRyICogdWRwaGRycCAgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKHBvcnQgPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkgewotICAgICAgICBwcmludGsoIlBvcnQgRXJyb3JcbiIpOwotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgaWYgKHNrYi0+cHJvdG9jb2wgPT0gRVRZX0lQVjQpIHsKLSAgICAgICAgLyogR2V0IFVEUCBQb3J0ICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQotICAgIGlwaGRycCA9IHNrYi0+bmguaXBoOwotI2Vsc2UKLSAgICBpcGhkcnAgPSBpcF9oZHIoc2tiKTsKLSNlbmRpZgotCi0gICAgICAgIGlmICgoaXBoZHJwKSAmJiAoaXBoZHJwLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkpIHsKLSNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjIpCi0gICAgICAgIHVkcGhkcnAgPSBza2ItPmgudWg7Ci0jZWxzZQotICAgICAgICB1ZHBoZHJwID0gdWRwX2hkcihza2IpOwotI2VuZGlmCi0gICAgICAgICAgICBpZiAodWRwaGRycCkgewotICAgICAgICAgICAgICAgIGlmICh1ZHBoZHJwID09IChzdHJ1Y3QgdWRwaGRyICopaXBoZHJwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVkcGhkcnAgPSAoc3RydWN0IHVkcGhkciAqKSgoY2hhciAqKXVkcGhkcnAgKyAoNCooaXBoZHJwLT5paGwpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZpbmQgY29uZmlndXJlZCBVRFAgU291cmNlIFBvcnQqLwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9zcmMpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjWzBdKTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5zb3VyY2UgPT0gdWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS51ZHBfcG9ydCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICh1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfc3JjW2ldLnR4X3NwZWMudHhxICE9IE1WX0VUSF9UWFFfSU5WQUxJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSAodHhfc3BlY19vdXQsICYodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjKSwgc2l6ZW9mKHN0cnVjdCBtdl9ldGhfdHhfc3BlYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBmb3VuZCB1ZHBfc3JjIDB4KCUwNHgpXG4iLCBfX2Z1bmNfXywgbnRvaHModWRwaGRycC0+c291cmNlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIGNvbmZpZ3VyZWQgVURQIERlc3QuIFBvcnQqLwotICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3QpL3NpemVvZih1ZHBfcG9ydF9zcGVjX2NmZ1twb3J0XS51ZHBfZHN0WzBdKTtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1ZHBoZHJwLT5kZXN0ID09IHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udWRwX3BvcnQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAodWRwX3BvcnRfc3BlY19jZmdbcG9ydF0udWRwX3NyY1tpXS50eF9zcGVjLnR4cSAhPSBNVl9FVEhfVFhRX0lOVkFMSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkgKHR4X3NwZWNfb3V0LCAmKHVkcF9wb3J0X3NwZWNfY2ZnW3BvcnRdLnVkcF9kc3RbaV0udHhfc3BlYyksIHNpemVvZihzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlczogZm91bmQgdWRwX2RzdCAweCglMDR4KVxuIiwgX19mdW5jX18sIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIGlmICggKHBvcnQgPT0gTVZfUE9OX1BPUlRfSUQpICYmIG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCIlczpERUJVRyA6IFBhY2tldCBVRFAsIHVkcCBzb3VyY2Ugb3IgZGVzdCBwb3J0IG5vdCBmb3VuZCB1ZHBfc3JjKCV4KXggdWRwX2RzdCgleCl4XG4iLAotICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLG50b2hzKHVkcGhkcnAtPnNvdXJjZSksIG50b2hzKHVkcGhkcnAtPmRlc3QpKTsKLSAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSAmJiBtdl9jdXN0X2RlYnVnX2NvZGUgKQotICAgICAgICAgICAgcHJpbnRrKCIlczpERUJVRyA6IE5PVCBVRFAsIGlwX3Byb3RvKCVkKSBcbiIsIF9fZnVuY19fLCBpcGhkcnAtPnByb3RvY29sKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIChwb3J0ID09IE1WX1BPTl9QT1JUX0lEKSAmJiBtdl9jdXN0X2RlYnVnX2NvZGUgKQotICAgICAgICBwcmludGsoIiVzOkRFQlVHIDogTk9UIElQLCBwcm90byglZCkgXG4iLCBfX2Z1bmNfXywgc2tiLT5wcm90b2NvbCk7Ci0KLSAgICByZXR1cm4gMDsKLQotfQotI2VuZGlmCi0KLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotdm9pZCBtdl9jdXN0X2Zsb3dfbWFwX3ByaW50KHZvaWQpCi17Ci0gICAgcHJpbnRrKCIqKioqKioqKioqKioqIEZsb3cgTWFwcGluZyBDb25maWd1cmF0aW9uICoqKioqKioqKioqKioqKioqXG5cbiIpOwotICAgIHByaW50aygiRmxvdyBtYXBwaW5nIHZhbGlkID0gJWRcbiIsIG12X2N1c3RfZmxvd19tYXApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZmxvd19tYXBfcGFyc2UodWludDhfdCAqZGF0YSwgdWludDE2X3QgKnZsYW4sIHVpbnQ4X3QgKnBiaXRzLCB1aW50OF90IGRpcikKLXsKLSAgICB1aW50MTZfdCBldHk7Ci0gICAgdWludDhfdCAqZmllbGRwIDsKLQotICAgIGlmIChNVl9DVVNUX0ZMT1dfRElSX1VTID09IGRpcikKLSAgICAgICAgZmllbGRwID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU47Ci0gICAgZWxzZQotICAgICAgICBmaWVsZHAgPSBkYXRhICsgRVRIX0FMRU4gKyBFVEhfQUxFTiArIE1WX0VUSF9NSF9TSVpFOwotCi0gICAgLyogTG9vcCB0aHJvdWdoIFZMQU4gdGFncyAqLwotICAgIGV0eSA9IG50b2hzKCoodWludDE2X3QgKilmaWVsZHApOwotICAgIGlmIChldHkgPT0gMHg4MTAwIHx8IGV0eSA9PSAweDg4QTggfHwgZXR5ID09IDB4OTEwMCkgewotICAgICAgICBmaWVsZHAgKz0gMjsKLSAgICAgICAgKnZsYW4gID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgICAgICpwYml0cyA9ICgqdmxhbiA+PiAxMyApICYgMHg3OwotICAgICAgICAqdmxhbiAgPSAoKnZsYW4pICYgMHhmZmY7Ci0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybigwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oMCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXZfY3VzdF9mbG93X21hcF9tb2QodWludDhfdCAqZGF0YSwgdWludDE2X3QgdmlkLCB1aW50OF90IHBiaXRzLCB1aW50OF90IGRpcikKLXsKLSAgICB1aW50MTZfdCBldHkgID0gMDsKLSAgICB1aW50MTZfdCB2bGFuID0gMDsKLSAgICB1aW50OF90ICpmaWVsZHA7Ci0KLSAgICBpZiAoTVZfQ1VTVF9GTE9XX0RJUl9VUyA9PSBkaXIpCi0gICAgICAgIGZpZWxkcCA9IGRhdGEgKyBFVEhfQUxFTiArIEVUSF9BTEVOOwotICAgIGVsc2UKLSAgICAgICAgZmllbGRwID0gZGF0YSArIEVUSF9BTEVOICsgRVRIX0FMRU4gKyBNVl9FVEhfTUhfU0laRTsKLQotICAgIC8qIElmIG5vdCBuZWVkIHRvIG1vZGlmeSBWSUQgb3IgUC1iaXRzICovCi0gICAgaWYoKHZpZCA9PSBNVl9DVVNUX1ZJRF9OT1RfQ0FSRV9WQUxVRSkgJiYKLSAgICAgICAocGJpdHMgPT0gTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkpCi0gICAgICAgIHJldHVybiAoMSk7Ci0KLSAgICAvKiBMb29wIHRocm91Z2ggVkxBTiB0YWdzICovCi0gICAgZXR5ID0gbnRvaHMoKih1aW50MTZfdCAqKWZpZWxkcCk7Ci0gICAgaWYgKGV0eSA9PSAweDgxMDAgfHwgZXR5ID09IDB4ODhBOCB8fCBldHkgPT0gMHg5MTAwKSB7Ci0gICAgICAgIGZpZWxkcCArPSAyOwotCi0gICAgICAgIHZsYW4gPSBudG9ocygqKHVpbnQxNl90ICopZmllbGRwKTsKLQotICAgICAgICBpZiAodmlkIDwgTVZfQ1VTVF9WSURfTk9UX0NBUkVfVkFMVUUpCi0gICAgICAgICAgICB2bGFuID0gKHZsYW4gJiAweGYwMDApIHwgKHZpZCAmIDB4ZmZmKTsKLSAgICAgICAgaWYgKHBiaXRzIDwgTVZfQ1VTVF9QQklUU19OT1RfQ0FSRV9WQUxVRSkKLSAgICAgICAgICAgIHZsYW4gPSAodmxhbiAmIDB4MGZmZikgfCAoKHBiaXRzICYgMHg3KSA8PCAxMyk7Ci0KLSAgICAgICAgKih1aW50MTZfdCAqKWZpZWxkcCA9IGh0b25zKHZsYW4pOwotICAgICAgICByZXR1cm4oMSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICByZXR1cm4oMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuKDApOwotfQotCi1zdGF0aWMgaW50IG12X2N1c3RfZmxvd19tYXBfcngoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRhX3J4X2Rlc2MgKnJ4X2Rlc2MpCi17Ci0gICAgdWludDE2X3QgdmxhbiAgICAgICAgPSAwOwotICAgIHVpbnQ4X3QgIHBiaXRzICAgICAgID0gMDsKLSAgICBpbnQgICAgICBidGFnICAgICAgICA9IDA7Ci0gICAgaW50ICAgICAgcmV0ICAgICAgICAgPSAwOwotICAgIG12X2N1c3RfaW9jdGxfZmxvd19tYXBfdCBjdXN0X2Zsb3c7Ci0KLSAgICBpZiAoTVZfUE9OX1BPUlRfSUQgIT0gcG9ydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobXZfY3VzdF9mbG93X21hcCkgewotCi0gICAgICAgIC8qIFBhcnNlIHBhY2tldHMgdG8gY2hlY2sgd2hldGhlciBpdCBpcyB0YWdnZWQgb3IgdW50YWdnZWQsIGFuZCBnZXQgdmxhbiBhbmQgcGJpdHMgaW4gdGFnZ2VkIG1vZGUgKi8KLSAgICAgICAgYnRhZyA9IG12X2N1c3RfZmxvd19tYXBfcGFyc2Uoc2tiLT5kYXRhLCAmdmxhbiwgJnBiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX0RTKTsKLSAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIiAlcyBUWCBwYWNrZXQgMSBidGFnWyVkXSB2bGFuWyVkXSAgcGJpdHNbJWRdXG4iLCBfX2Z1bmNfXywgYnRhZywgdmxhbiwgcGJpdHMpOwotCi0gICAgICAgIC8qIFRoZSBmcmFtZSBpcyB0YWdnZWQgKi8KLSAgICAgICAgaWYgKGJ0YWcgPT0gMSkgewotICAgICAgICAgICAgY3VzdF9mbG93LnZpZCAgICA9IHZsYW47Ci0gICAgICAgICAgICBjdXN0X2Zsb3cucGJpdHMgID0gcGJpdHM7Ci0gICAgICAgICAgICBjdXN0X2Zsb3cuZGlyICAgID0gTVZfQ1VTVF9GTE9XX0RJUl9EUzsKLQotICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIiAlcyBUWCBwYWNrZXQgMiB0cmdfcG9ydFslZF0gdHJnX3F1ZXVlWyVkXSAgZ2VtX3BvcnRbJWRdXG4iLCBfX2Z1bmNfXywgcGt0X2Z3ZC50cmdfcG9ydCwgcGt0X2Z3ZC50cmdfcXVldWUsIHBrdF9md2QuZ2VtX3BvcnQpOwotCi0gICAgICAgICAgICAvKiBNb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLQotICAgICAgICAgICAgICAgIC8qIG1vZGlmeSBWSUQgYW5kIFAtYml0cyBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICByZXQgPSBtdl9jdXN0X2Zsb3dfbWFwX21vZChza2ItPmRhdGEsIGN1c3RfZmxvdy5tb2RfdmlkLCBjdXN0X2Zsb3cubW9kX3BiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX0RTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi1pbnQgbXZfY3VzdF9mbG93X21hcF90eChpbnQgcG9ydCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgc3RydWN0IGlwaGRyICppcGhkcnAgPSBOVUxMOwotICAgIHVpbnQxNl90IHZsYW4gICAgICAgID0gMDsKLSAgICB1aW50OF90ICBwYml0cyAgICAgICA9IDA7Ci0gICAgaW50ICAgICAgYnRhZyAgICAgICAgPSAwOwotICAgIGludCAgICAgIHJldCAgICAgICAgID0gMDsKLSAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgY3VzdF9mbG93OwotCi0gICAgaWYgKE1WX1BPTl9QT1JUX0lEICE9IHBvcnQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG12X2N1c3RfZmxvd19tYXApIHsKLQotICAgICAgICBjdXN0X2Zsb3cuZGlyICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0KLSAgICAgICAgLyogUGFyc2UgcGFja2V0cyB0byBjaGVjayB3aGV0aGVyIGl0IGlzIHRhZ2dlZCBvciB1bnRhZ2dlZCwgYW5kIGdldCB2bGFuIGFuZCBwYml0cyBpbiB0YWdnZWQgbW9kZSAqLwotICAgICAgICBidGFnID0gbXZfY3VzdF9mbG93X21hcF9wYXJzZShza2ItPmRhdGEsICZ2bGFuLCAmcGJpdHMsIE1WX0NVU1RfRkxPV19ESVJfVVMpOwotCi0gICAgICAgIC8qIFRoZSBmcmFtZSBpcyB0YWdnZWQgKi8KLSAgICAgICAgaWYgKGJ0YWcgPT0gMSkgewotICAgICAgICAgICAgY3VzdF9mbG93LnZpZCAgICA9IHZsYW47Ci0gICAgICAgICAgICBjdXN0X2Zsb3cucGJpdHMgID0gcGJpdHM7Ci0KLSAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICIgJXMgVFggcGFja2V0IDIgdHJnX3BvcnRbJWRdIHRyZ19xdWV1ZVslZF0gIGdlbV9wb3J0WyVkXVxuIiwgX19mdW5jX18sIHBrdF9md2QudHJnX3BvcnQsIHBrdF9md2QudHJnX3F1ZXVlLCBwa3RfZndkLmdlbV9wb3J0KTsKLQotICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgIGlmIChyZXQgPT0gTVZfQ1VTVF9PSykgewotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9ICh1OCljdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQ7Ci0gICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWU7Ci0gICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKLSAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIG1vZGlmeSBWSUQgYW5kIFAtYml0cyBpZiBuZWVkZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF9mbG93X21hcF9tb2Qoc2tiLT5kYXRhLCBjdXN0X2Zsb3cubW9kX3ZpZCwgY3VzdF9mbG93Lm1vZF9wYml0cywgTVZfQ1VTVF9GTE9XX0RJUl9VUyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAvKiBMb29rIGZvciBydWxlcyB0aGF0IGRvZXMgbm90IGNhcmUgVkxBTiAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy52aWQgICA9IE1WX0NVU1RfREVGQVVMVF9TSU5HTEVfVEFHX1JVTEU7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF90YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotCi0gICAgICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gKHU4KWN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+aHdfY21kICA9ICgoY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0IDw8IDgpfDB4MDAxMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhfZnVuYyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+ZmxhZ3MgICA9IE1WX0VUSF9GX01IOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2RpZnkgVklEIGFuZCBQLWJpdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtdl9jdXN0X2Zsb3dfbWFwX21vZChza2ItPmRhdGEsIGN1c3RfZmxvdy5tb2RfdmlkLCBjdXN0X2Zsb3cubW9kX3BiaXRzLCBNVl9DVVNUX0ZMT1dfRElSX1VTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBUaGUgZnJhbWUgaXMgdW50YWdnZWQsIHRyeSB0byBnZXQgRFNDUCB2YWx1ZSAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChza2ItPnByb3RvY29sID09IEVUWV9JUFY0KSB7Ci0gICAgICAgICAgICAgICAgLyogR2V0IFVEUCBQb3J0ICovCi0jaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIyKQotICAgICAgICAgICAgICAgIGlwaGRycCA9IHNrYi0+bmguaXBoOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBpcGhkcnAgPSBpcF9oZHIoc2tiKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5kc2NwICA9IChpcGhkcnAtPnRvcyA+PiAyKSAmIDB4M2Y7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LmRpciAgID0gTVZfQ1VTVF9GTE9XX0RJUl9VUzsKLQotICAgICAgICAgICAgICAgIHJldCA9IG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOwotICAgICAgICAgICAgICAgIC8qIFNldCBHRU0gcG9ydCwgdGFyZ2V0IHBvcnQgYW5kIHF1ZXVlICovCi0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSBNVl9DVVNUX09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eF9zcGVjX291dC0+dHhwICAgICA9IGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHEgICAgID0gY3VzdF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5od19jbWQgID0gKChjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgPDwgOCl8MHgwMDEwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eF9mdW5jID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT5mbGFncyAgID0gTVZfRVRIX0ZfTUg7OwotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VzdF9mbG93LmRzY3AgID0gMDsKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSBNVl9DVVNUX0ZMT1dfRElSX1VTOwotCi0gICAgICAgICAgICAgICAgcmV0ID0gbXZfY3VzdF91bnRhZ19tYXBfcnVsZV9nZXQoJmN1c3RfZmxvdyk7Ci0gICAgICAgICAgICAgICAgLyogU2V0IEdFTSBwb3J0LCB0YXJnZXQgcG9ydCBhbmQgcXVldWUgKi8KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IE1WX0NVU1RfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NwZWNfb3V0LT50eHAgICAgID0gY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0OwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4cSAgICAgPSBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3F1ZXVlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmh3X2NtZCAgPSAoKGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCA8PCA4KXwweDAwMTApOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPnR4X2Z1bmMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgdHhfc3BlY19vdXQtPmZsYWdzICAgPSBNVl9FVEhfRl9NSDs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLQotCi12b2lkIG12X2N1c3RfcHJpbnQoaW50IHR5cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKQotICAgIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRQotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfSUdNUDoKLSAgICAgICAgICAgIG12X2N1c3RfaWdtcF9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGNhc2UgTVZfQ1VTVF9BUFBfVFlQRV9NTEQ6Ci0gICAgICAgICAgICBtdl9jdXN0X21sZF9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICAgICAgY2FzZSBNVl9DVVNUX0FQUF9UWVBFX0xQQks6Ci0gICAgICAgICAgICBtdl9jdXN0X2xvb3BkZXRfcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgTVZfQ1VTVF9BUFBfVFlQRV9PQU06Ci0gICAgICAgICAgICBtdl9jdXN0X2VvYW1fcHJpbnQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1WX0NVU1RfQVBQX1RZUEVfT01DSToKLSAgICAgICAgICAgIG12X2N1c3Rfb21jaV9wcmludCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci1FWFBPUlRfU1lNQk9MKG12X2N1c3RfcHJpbnQpOwotCi0KLXZvaWQgbXZfY3VzdF9yeF9mdW5jKGludCBwb3J0LCBpbnQgcnhxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykKLXsKLSAgICB1aW50MzJfdCBpOwotCi0gICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICBwcmludGsoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLSAgICBpZiAoZGV2ID09IE5VTEwgfHwgc2tiID09IE5VTEwgfHwgcnhfZGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIHByaW50aygiJXM6IE5VTEwgUG9pbnRlciBkZXYoJXApIHNrYiglcCkgcnhfZGVzYyglcClcbiIsCi0gICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2LCBza2IsIHJ4X2Rlc2MpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKQotICAgIHsKLSAgICAgICAgaWYgKGdDdXN0Q29uZmlnW01WX0NVU1RfQVBQX1RZUEVfT01DSV0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3Rfb21jaV9yeChwb3J0LCBkZXYsIHNrYiwgcnhfZGVzYykpIHsKLSAgICAgICAgICAgICAgICBpZihtdl9jdXN0X2RlYnVnX2NvZGUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiJXMgb21jaV9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZXsKLSAgICAgICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX09BTV0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtdl9jdXN0X2Vwb25fb2FtX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBlb2FtX3BhY2tldFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9JR01QX0hBTkRMRQotICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9JR01QXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgICAgICBpZiAobXZfY3VzdF9pZ21wX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBpZ21wX3BhY2tldFxuIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgICAgIGlmIChnQ3VzdENvbmZpZ1tNVl9DVVNUX0FQUF9UWVBFX01MRF0uZW5hYmxlID09IE1WX0NVU1RfQVBQX0VOQUJMRSkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfbWxkX3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBtbGRfcGFja2V0XG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19NVl9DVVNUX0xQQktfREVURUNUX0hBTkRMRQotICAgICAgICBpZiAoZ0N1c3RDb25maWdbTVZfQ1VTVF9BUFBfVFlQRV9MUEJLXS5lbmFibGUgPT0gTVZfQ1VTVF9BUFBfRU5BQkxFKSB7Ci0gICAgICAgICAgICBpZiAobXZfY3VzdF9sb29wZGV0X3J4KHBvcnQsIGRldiwgc2tiLCByeF9kZXNjKSkgewotICAgICAgICAgICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBsb29wX2RldF9wYWNrZXRcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIC8vTVZDVVNUX0VSUl9QUklOVCgiU3BlY2lhbCBwa3QgYXJyaXZlZCBmcm9tIHBvcnQoJWQpLCB3YXMgbm90IGhhbmRsZWQuIFxuIiwgcG9ydCk7Ci0gICAgICAgIGRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0gICAgICAgIGlmKG12X2N1c3RfZGVidWdfY29kZSkgewotICAgICAgICAgICAgcHJpbnRrKCJJbnB1dCBQYWNrZXQgZmlyc3QgYnl0ZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoaT0wO2k8MjQ7aSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGklOD09IDApCi0gICAgICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKLSAgICAgICAgICAgICAgICBwcmludGsgKCIlMDJ4ICIsICooc2tiLT5kYXRhICsgaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgICAgICBpZiAobXZfY3VzdF9mbG93X21hcCkgewotICAgICAgICAgICAgaWYgKG12X2N1c3RfZmxvd19tYXBfcngocG9ydCwgZGV2LCBza2IsIHJ4X2Rlc2MpKSB7Ci0gICAgICAgICAgICAgICAgaWYobXZfY3VzdF9kZWJ1Z19jb2RlKQotICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzIGZsb3cgbWFwXG4iLCBfX2Z1bmNfXyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0KLWludCBtdl9jdXN0X3R4X2Z1bmMoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtdl9ldGhfdHhfc3BlYyAqdHhfc3BlY19vdXQpCi17Ci0gICAgaWYgKG12X2N1c3Rfb21jaV90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmIChtdl9jdXN0X2VvYW1fdHgocG9ydCwgZGV2LCBza2IsIHR4X3NwZWNfb3V0KSkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfSUdNUF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9pZ21wX3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9NTERfSEFORExFCi0gICAgaWYgKG12X2N1c3RfbWxkX3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9MUEJLX0RFVEVDVF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9sb29wZGV0X3R4KHBvcnQsIGRldiwgc2tiLCB0eF9zcGVjX291dCkpCi0gICAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUKLSAgICBpZiAobXZfY3VzdF9mbG93X21hcF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAvKiBTaW1wbGUgZXhhbXBsZSBmb3IgVURQIFNvdXJjZSBQb3J0IG9yIERlc3QgUG9ydCBQYXJzaW5nICovCi0gICAgLyogUGVyIFVEUCBzb3VyY2Ugb3IgZGVzdCBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBpZiAobXZfY3VzdF91ZHBfcG9ydF90eChwb3J0LCBkZXYsIHNrYiwgdHhfc3BlY19vdXQpKQotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLQotaW50IG12Y3VzdF9uZXRkZXZfaW5pdCh2b2lkKQotewotICAgIHVpbnQzMl90IHBvcnRfaTsKLQotICAgIC8qIFJldHJpZXZlIG51bV9wb3J0cywgYXMgaW4gbXZfZXRoX2luaXRfbW9kdWxlKi8KLSAgICBtdl9ldGhfcG9ydHNfbnVtID0gbXZDdHJsRXRoTWF4UG9ydEdldCgpOwotCi0gICAgaWYgKG12X2V0aF9wb3J0c19udW0gPiBDT05GSUdfTVZfRVRIX1BPUlRTX05VTSkKLSAgICAgICAgbXZfZXRoX3BvcnRzX251bSA9IENPTkZJR19NVl9FVEhfUE9SVFNfTlVNOwotCi0gICAgbXZfY3VzdF9lb2FtX2luaXQoKTsKLSAgICAKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgIG12X2N1c3RfdWRwX3RhYmxlX2RlbCgpOwotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgZmxvdyBtYXBwaW5nIGRhdGEgc3RydWN0dXJlICovCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgbXZfY3VzdF9mbG93X21hcF9pbml0KCk7Ci0jZW5kaWYKLQotICAgIC8qIFJlZ2lzdGVyIHNwZWNpYWwgcmVjZWl2ZSBjaGVjayBmdW5jdGlvbiAqLwotI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAotICAgIGZvciAocG9ydF9pPTA7cG9ydF9pPCBtdl9ldGhfcG9ydHNfbnVtO3BvcnRfaSsrKSB7Ci0gICAgICAgIG12X2V0aF9yeF9zcGVjaWFsX3Byb2NfZnVuYyhwb3J0X2ksIG12X2N1c3RfcnhfZnVuYyk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTCAqLwotCi0KLSAgICAvKiBSZWdpc3RlciBzcGVjaWFsIHRyYW5zbWl0IGNoZWNrIGZ1bmN0aW9uICovCi0jaWZkZWYgQ09ORklHX01WX0VUSF9UWF9TUEVDSUFMCi0gICAgZm9yIChwb3J0X2k9MDtwb3J0X2k8IG12X2V0aF9wb3J0c19udW07cG9ydF9pKyspIHsKLSAgICAgICAgbXZfZXRoX3R4X3NwZWNpYWxfY2hlY2tfZnVuYyhwb3J0X2ksIG12X2N1c3RfdHhfZnVuYyk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19NVl9FVEhfVFhfU1BFQ0lBTCAqLwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9uZXRkZXYuaCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MDc5NjMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfY3VzdC9tdl9jdXN0X25ldGRldi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3RfbmV0ZGV2LmgKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX212X2N1c3RfbmV0ZGV2X2hfXwotI2RlZmluZSBfX212X2N1c3RfbmV0ZGV2X2hfXwotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLQotI2luY2x1ZGUgPG12Q29tbW9uLmg+Ci0jaW5jbHVkZSA8bXZPcy5oPgotI2luY2x1ZGUgPG12X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaD4KLQotCi0jZGVmaW5lIE1WX0NVU1RfTUFTX1VEUF9TUkNfUE9SVCAgICAgICAgICA4Ci0jZGVmaW5lIE1WX0NVU1RfTUFTX1VEUF9EU1RfUE9SVCAgICAgICAgICA4Ci0jZGVmaW5lIE1WX0NVU1RfTlVNX0xMSUQgICAgICAgICAgICAgICAgICA4Ci0KLQotc3RydWN0IG12X3VkcF9wb3J0X3R4X3NwZWMgewotICAgIF9fYmUxNiAgICB1ZHBfcG9ydDsKLSAgICBzdHJ1Y3QgbXZfZXRoX3R4X3NwZWMgdHhfc3BlYzsKLX07Ci0KLXN0cnVjdCBtdl9wb3J0X3R4X3NwZWMgewotICAgIHN0cnVjdCBtdl91ZHBfcG9ydF90eF9zcGVjIHVkcF9zcmNbTVZfQ1VTVF9NQVNfVURQX1NSQ19QT1JUXTsKLSAgICBzdHJ1Y3QgbXZfdWRwX3BvcnRfdHhfc3BlYyB1ZHBfZHN0W01WX0NVU1RfTUFTX1VEUF9EU1RfUE9SVF07Ci19OwotCi0KLXN0cnVjdCBtdl9lb2FtX2xsaWRfc3BlYyB7Ci0gICAgdWludDhfdCBsbGlkX21hY19hZGRyZXNzWzZdOwotICAgIHN0cnVjdCAgbXZfZXRoX3R4X3NwZWMgdHhfc3BlYzsKLX07Ci0KLXR5cGVkZWYgZW51bQotewotICAgIE1WX0NVU1RfQVBQX1RZUEVfSUdNUCA9IDAsIC8qIEZvciBJR01QIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLSAgICBNVl9DVVNUX0FQUF9UWVBFX01MRCwgICAgICAvKiBGb3IgTUxEIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9MUEJLLCAgICAgLyogRm9yIGxvb3BiYWNrIGRldGVjdGlvbiBhcHBsaWNhdGlvbiAqLwotICAgIE1WX0NVU1RfQVBQX1RZUEVfT0FNLCAgICAgIC8qIEZvciBlT0FNIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLSAgICBNVl9DVVNUX0FQUF9UWVBFX09NQ0ksICAgICAvKiBGb3IgT01DSSBhcHBsaWNhdGlvbiAgICAgICAgICAgICAgICovCi0gICAgTVZfQ1VTVF9BUFBfVFlQRV9NQVggICAgICAgLyogTWF4IG51bWJlciBvZiBhcHBsaWNhdGlvbiAgICAgICAgICAqLyAKLX0gbXZfY3VzdF9hcHBfdHlwZV9lOwotCi0vKiAgRW51bTogZW5hYmxlIG9yIGRpc2FibGUgYXBwbGljYXRpb24qLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTVZfQ1VTVF9BUFBfRElTQUJMRSAgPSAwLAotICAgIE1WX0NVU1RfQVBQX0VOQUJMRSAgID0gMSwKLX0gbXZfY3VzdF9hcHBfZmxhZ19lOwotCi10eXBlZGVmIHN0cnVjdAotewotICAgIG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZTsgLyogQXBwbGljYXRpb24gdHlwZSwgc3VjaCBhcyBJR01QLCBNTEQgICAgICAgICAgICAgICAgKi8KLSAgICB1aW50MTZfdCAgICAgICAgICAgZW5hYmxlOyAgIC8qIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gZW5hYmxlIGFwcGxpY2F0aW9uIFJ4L1R4ICovICAgICAgICAgCi0gICAgdWludDE2X3QgICAgICAgICAgIGV0aF90eXBlOyAvKiBBcHBsaWNhdGlvbiBFdGhlcm5ldCB0eXBlIHVzZWQgZm9yIHNvY2tldC9za2IgICAgICAqLwotICAgIGNoYXIgICAgICAgICAgICAgICpuYW1lOyAgICAgLyogVGhlIHJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICAgICAgICAgICAgICAgKi8KLX0gbXZfY3VzdF9hcHBfY29uZmlnX3Q7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gcHJvdG90eXBlcyAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgICAgICAgIG12X2N1c3Rfb21jaV9od19jbWRfc2V0KHVuc2lnbmVkIGludCBod19jbWQpOwotaW50ICAgICAgICAgbXZfY3VzdF9vbWNpX3R4X3NldChpbnQgdGNvbnQsIGludCB0eHEpOwotCi0jaWZkZWYgIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFCi1NVl9TVEFUVVMgICBtdl9jdXN0X3VkcF9zcmNfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9zcmNfcG9ydCwgdWludDhfdCB0eHAsIHVpbnQ4X3QgdHhxLCB1aW50MTZfdCBmbGFncywgdWludDMyX3QgaHdfY21kKTsKLU1WX1NUQVRVUyAgIG12X2N1c3RfdWRwX2Rlc3Rfc3BlY19zZXQoaW50IHR4X3BvcnQsIHVpbnQxNl90IHVkcF9kZXN0X3BvcnQsIHVpbnQ4X3QgdHhwLCB1aW50OF90IHR4cSwgdWludDE2X3QgZmxhZ3MsIHVpbnQzMl90IGh3X2NtZCk7Ci0jZW5kaWYKLQotdm9pZCAgICAgICAgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KGludCB2YWwpOwotaW50ICAgICAgICAgbXZfY3VzdF9vbWNpX3NldChpbnQgdGNvbnQsIGludCB0eHEsIGludCBnZW1wb3J0LCBpbnQga2VlcF9yeF9taCk7Ci1pbnQgICAgICAgICBtdl9jdXN0X2VvYW1fbGxpZF9zZXQoaW50IGxsaWQsIHVpbnQ4X3QgKmxsaWRfbWFjLCBpbnQgdHhxKTsKLQotdm9pZCAgICAgICAgbXZfY3VzdF9hcHBfZmxhZ19zZXQobXZfY3VzdF9hcHBfdHlwZV9lIGFwcF90eXBlLCB1aW50MTZfdCBlbmFibGUpOwotdm9pZCAgICAgICAgbXZfY3VzdF9hcHBfZXR5cGVfc2V0KG12X2N1c3RfYXBwX3R5cGVfZSBhcHBfdHlwZSwgdWludDE2X3QgZXRoX3R5cGUpOwotdm9pZCAgICAgICAgbXZfY3VzdF9wcmludChpbnQgdHlwZSk7Ci0KLQotI2VuZGlmIC8qIF9fbXZfY3VzdF9uZXRkZXZfaF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9zeXNmcy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9jdXN0L212X2N1c3Rfc3lzZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2M1MGM4OC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X2N1c3QvbXZfY3VzdF9zeXNmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChDKSAyMDEwLCBNYXJ2ZWxsIFRlY2hub2xvZ3kgR3JvdXAgTHRkLgotKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBUaGlzIGlzIFVOUFVCTElTSEVEIFBST1BSSUVUQVJZIFNPVVJDRSBDT0RFIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cDsKLSogdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgbm90IGJlIGRpc2Nsb3NlZCB0byB0aGlyZCBwYXJ0aWVzLCBjb3BpZWQKLSogb3IgZHVwbGljYXRlZCBpbiBhbnkgZm9ybSwgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgcHJpb3IKLSogd3JpdHRlbiBwZXJtaXNzaW9uIG9mIE1hcnZlbGwgVGVjaG5vbG9neSBHcm91cC4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBNYXJ2ZWxsIEdQTCBMaWNlbnNlIE9wdGlvbgotKgotKiBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCi0qIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAotKiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKLSogYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQotKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCi0qIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgotKgotKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECi0qIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKLSogRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQotKiBkaXNjbGFpbWVyLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12X2N1c3Rfc3lzZnMuYwotKgotKiBERVNDUklQVElPTjoKLSoKLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxnYmUvbXZOZXRhLmg+Ci0jaW5jbHVkZSA8cG5jL212UG5jLmg+Ci0KLSNpbmNsdWRlICJtdl9jdXN0X2Rldi5oIgotI2luY2x1ZGUgIm12X2N1c3RfbmV0ZGV2LmgiCi0jaW5jbHVkZSAibXZfY3VzdF9mbG93X21hcC5oIgotI2luY2x1ZGUgIm12X2N1c3RfbW5nX2lmLmgiCi0KLXN0YXRpYyBpbnQgICAgICBlb2FtX3R4cSA9IDA7Ci1zdGF0aWMgdWludDhfdCAgZW9hbV9tYWNbNl0gPSB7MH07Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfaGVscChjaGFyICpidWYpCi17Ci0gICAgaW50IG9mZiA9IDA7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgaGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyB0aGlzIGhlbHBcbiIpOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJjYXQgIHVkcF9wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAtIHNob3cgc3BlY2lhbCB1ZHAgc291cmNlIGFuZCBkZXN0LiBwb3J0IGNvbmZpZ3VyYXRpb25cbiIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgZmxvd19tYXAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gc2hvdyBmbG93IG1hcHBpbmcgY29uZmlndXJhdGlvblxuIik7ICAgICAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBmbG93X21hcF9zaG93ICAgICAgICAgICAgICAgICAgICAgLSBzaG93IGZsb3cgbWFwcGluZyBydWxlcyBcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBmbG93X21hcF9jbGVhciAgICAgICAgICAgICAgICAgICAgLSBjbGVhciBhbGwgZmxvdyBtYXBwaW5nIHJ1bGVzXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiY2F0ICBkc2NwX21hcF9kZWwgICAgICAgICAgICAgICAgICAgICAgLSBkZWxldGUgRFNDUCB0byBQLWJpdHMgbWFwcGluZyBydWxlc1xuIik7ICAgIAotI2VuZGlmCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImNhdCAgdGNvbnRfc2hvdyAgICAgICAgICAgICAgICAgICAgICAgIC0gU2hvdyBhbGwgVC1DT05UIHN0YXRlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB0Y29udCBzdGF0ZSAgICAgICAgPiB0Y29udF9zZXQgICAgLSBTZXQgVC1DT05UIHRhdHVzLCB0Y29udCgwfjcpLCBzdGF0ZSgxOmVuYWJsZSwgMDpkaXNhYmxlKSBcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICA+IGRlYnVnICAgICAgICAtIFNldCBDdXN0b21pemVkIG1vZHVsZSBkZWJ1ZyBpbmZvcm1hdGlvbiBcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGFwcF90eXBlICAgICAgICAgICA+IGFwcF9zaG93ICAgICAtIFNob3cgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4gMDppZ21wLCAxOm1sZCwgMjpscGJrLCAzOmVvYW0sIDQ6b21jaVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gYXBwX3R5cGUgZW5hYmxlICAgID4gYXBwX2ZsYWdfc2V0IC0gRW5hYmxlL2Rpc2FibGUgYXBwbGljYXRpb24uIDA6aWdtcCwgMTptbGQsIDI6bHBiaywgMzplb2FtLCA0Om9tY2ksIDE6ZW5hYmxlLCAwOmRpc2FibGVcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGFwcF90eXBlIGhleCAgICAgICA+IGFwcF9ldHlwZV9zZXQtIFNldCBhcHBsaWNhdGlvbiBFdGggdHlwZS4gMDppZ21wLCAxOm1sZCwgMjpscGJrLCAzOmVvYW0sIDQ6b21jaVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdGMgdHhxIGdlbSBrZWVwX21oID4gb21jaV9zZXQgICAgIC0gc2V0IHVkcCBzb3VyY2UgcG9ydCBzcGVjaWFsIFR4IGJlaGF2aW9yXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBrZWVwX21oICAgICAgICAgICAgPiBlb2FtX2doX2tlZXAgLSBLZWVwIG9yIG5vdCBrZWVwIEdIIGZvciBlT0FNIHBhY2tldHMsIDE6a2VlcCwgMDpkbyBub3Qga2VlcFxuIik7ICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHR4cSAgICAgICAgICAgICAgICA+IGVvYW1fdHhxICAgICAtIHNldCBUWCBxdWV1ZSBpbnRvIHN3X2J1ZmZlciBmb3IgRU9BTSBsbGlkIGNvbW1hbmRcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIG1hY1swXS1tYWNbNV0gICAgICA+IGVvYW1fbWFjICAgICAtIHNldCBMTElEIG1hYyBpbnRvIHN3X2J1ZmZlciBmb3IgRU9BTSBsbGlkIGNvbW1hbmRcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGxsaWQgICAgICAgICAgICAgICA+IGVvYW1fd3JpdGUgICAtIFdyaXRlIEVPQU0gdHhxIGFuZCBtYWMgYWRkcmVzcyBmcm9tIHN3X2J1ZmZlciBpbnRvIExMSURcbiIpOwotI2lmZGVmIENPTkZJR19NVl9DVVNUX1VEUF9TQU1QTEVfSEFORExFICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX3NyYyhkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9zcmMgLSBzZXQgdWRwIHNvdXJjZSBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOwotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHAgdWRwX2RzdChkZWMpIHR4cCB0eHEgZmxhZ3MgaHdfY21kICA+IHVkcF9kc3QgLSBzZXQgdWRwIGRlc3QuICBwb3J0IHNwZWNpYWwgVHggYmVoYXZpb3JcbiIpOwotI2VuZGlmICAgIAotI2lmZGVmIENPTkZJR19NVl9DVVNUX0ZMT1dfTUFQX0hBTkRMRQotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIGhleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IGZsb3dfbWFwX2RlYnVnICAtIFNldCBmbG93IG1hcHBpbmcgZGVidWcgZmxhZywgMTplbmFibGUsIDA6ZGlzYWJsZSBcbiIpOyAgICAKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB2aWQgcGJpdHMgbW9kX3ZpZCBtb2RfcGJpdHMgdHJnX3BvcnQgdHJnX3F1ZXVlIHRyZ19od2ZfcXVldWUgZ2VtX3BvcnQgID4gZmxvd19tYXBfdXNfc2V0IC0gc2V0IFUvUyBmbG93IG1hcHBpbmcgcnVsZVxuIik7Ci0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmlkIHBiaXRzIG1vZF92aWQgbW9kX3BiaXRzICAgICAgICAgID4gZmxvd19tYXBfZHNfc2V0IC0gc2V0IEQvUyBmbG93IG1hcHBpbmcgcnVsZVxuIik7ICAgIAotICAgIG9mZiArPSBzcHJpbnRmKGJ1ZitvZmYsICJlY2hvIHBiaXRzMCBwYml0czEgLi4uIHBiaXRzNjIgcGJpdHM2MyAgICA+IGRzY3BfbWFwX3NldCAgICAtIHNldCBEU0NQIHRvIFAtYml0cyBtYXBwaW5nIHJ1bGVzXG4iKTsgICAgCi0gICAgb2ZmICs9IHNwcmludGYoYnVmK29mZiwgImVjaG8gdmxhbiBwYml0cyBkaXIoMDpVL1MsIDE6RC9TKSAgICAgICAgID4gZmxvd19tYXBfZGVsICAgIC0gZGVsZXRlIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyB2bGFuIHBiaXRzIGRpcigwOlUvUywgMTpEL1MpICAgICAgICAgPiB0YWdfZmxvd19nZXQgICAgLSBnZXQgdGFnZ2VkIGZsb3cgbWFwcGluZyBydWxlXG4iKTsKLSAgICBvZmYgKz0gc3ByaW50ZihidWYrb2ZmLCAiZWNobyBkc2NwIGRpcigwOlUvUywgMTpEL1MpICAgICAgICAgICAgICAgPiB1bnRhZ19mbG93X2dldCAgLSBnZXQgdW50YWdnZWQgZmxvdyBtYXBwaW5nIHJ1bGVcbiIpOwotI2VuZGlmICAgICAgICAKLQotICAgIHJldHVybiBvZmY7Ci19Ci0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0gICAgaW50IG9mZiAgID0gMDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGJvb2wgc3RhdGU7Ci0gICAgY29uc3QgY2hhciogbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLQotICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJoZWxwIikgKSB7Ci0gICAgICAgIG9mZiA9IG12X2N1c3Rfc3BlY19wcm9jX2hlbHAoYnVmKTsKLSAgICB9Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUgICAgICAgCi0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3BvcnRzIikpIHsKLSAgICAgICAgbXZfY3VzdF91ZHBfc3BlY19wcmludF9hbGwoKTsKLSAgICB9Ci0jZW5kaWYgICAgCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFICAgICAgIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwIikpIHsgCi0gICAgICAgIG12X2N1c3RfZmxvd19tYXBfcHJpbnQoKTsKLSAgICB9ICAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9zaG93IikpIHsKLSAgICAgICAgbXZfY3VzdF9tYXBfdGFibGVfcHJpbnQoKTsKLSAgICB9IAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwX2NsZWFyIikpIHsKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9jbGVhcigpOwotICAgIH0gIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImRzY3BfbWFwX2RlbCIpKSB7Ci0gICAgICAgIG12X2N1c3RfZHNjcF9tYXBfZGVsKCk7Ci0gICAgfSAgICAgCi0jZW5kaWYKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ0Y29udF9zaG93IikpIHsKLSAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiTVZfQ1VTVCBULUNPTlQgc3RhdGUgdGFibGVcbiIpOwotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJEZWZhdWx0IGludmFsaWQgVHhxOiVkIFxuIiwgQ1BIX0lOVkFMSURfVFJHVF9RVUVVRSk7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQ1BIX01BWF9UQ09OVF9OVU07IGluZGV4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0YXRlID0gbXZfY3VzdF9nZXRfdGNvbnRfc3RhdGUoaW5kZXgpOwotICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiVC1DT05UJTEuMWQ6ICVzXG4iLCBpbmRleCwgKHN0YXRlPT10cnVlKT8iZW5hYmxlZCI6ImRpc2FibGVkIik7Ci0gICAgICAgIH0KLSAgICB9IAotICAgIGVsc2UKLSAgICAgICAgb2ZmID0gbXZfY3VzdF9zcGVjX3Byb2NfaGVscChidWYpOwotCi0gICAgcmV0dXJuIG9mZjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgdjsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgdiA9IDA7Ci0KLSAgICBzc2NhbmYoYnVmLCAiJXgiLCAmdik7Ci0gICAgCi0gICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJkZWJ1ZyIpKSB7Ci0gICAgICAgIG12X2N1c3RfZGVidWdfaW5mb19zZXQodik7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImFwcF9zaG93IikpIHsKLSAgICAgICAgbXZfY3VzdF9wcmludCh2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZW9hbV9naF9rZWVwIikpIHsKLSAgICAgICAgbXZfY3VzdF9vYW1fcnhfZ2hfc2V0KHYpOwotICAgIH0gICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJlb2FtX3R4cSIpKSB7Ci0gICAgICAgIGVvYW1fdHhxID0gdjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZW9hbV93cml0ZSIpKSB7Ci0gICAgICAgIG12X2N1c3RfZW9hbV9sbGlkX3NldCgoaW50KXYsICZlb2FtX21hY1swXSwgZW9hbV90eHEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jXzJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIqICAgICBuYW1lID0gYXR0ci0+YXR0ci5uYW1lOwotICAgIHVuc2lnbmVkIGludCAgICBwLCB2OwotICAgIHVuc2lnbmVkIGxvbmcgICBmbGFnczsKLQotICAgIGlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLSAgICAgICAgcmV0dXJuIC1FUEVSTTsKLQotICAgIC8qIFJlYWQgaW5wdXQgKi8KLSAgICBwID0gMDsKLSAgICB2ID0gMDsKLSAgICBzc2NhbmYoYnVmLCAiJWQgJXgiLCAmcCwgJnYpOwotCi0gICAgcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJhcHBfZmxhZ19zZXQiKSkgewotICAgICAgICBtdl9jdXN0X2FwcF9mbGFnX3NldChwLCB2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYXBwX2V0eXBlX3NldCIpKSB7Ci0gICAgICAgIG12X2N1c3RfYXBwX2V0eXBlX3NldChwLCB2KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidGNvbnRfc2V0IikpIHsKLSAgICAgICAgaWYgKHYpCi0gICAgICAgICAgICBtdl9jdXN0X3NldF90Y29udF9zdGF0ZShwLCB0cnVlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUocCwgZmFsc2UpOwotICAgIH0gICAgCi0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgcCwgdjE9MCwgdjI9MCwgdjM9MCwgdjQ9MCwgdjU9MDsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgc3NjYW5mKGJ1ZiwgIiVkICVkICV4ICV4ICV4ICV4IiwgJnAsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1KTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAidWRwX3NyYyIpKSB7Ci0jaWZkZWYgQ09ORklHX01WX0NVU1RfVURQX1NBTVBMRV9IQU5ETEUKLSAgICAgICAgbXZfY3VzdF91ZHBfc3JjX3NwZWNfc2V0KHAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7Ci0jZWxzZQotICAgICAgICBwcmludGsoIm12X2N1c3QgbW9kdWxlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBVRFAgU0FNUExFIENvbmZpZyBTdXBwb3J0XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJ1ZHBfZHN0IikpIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9VRFBfU0FNUExFX0hBTkRMRQotICAgICAgICBtdl9jdXN0X3VkcF9kZXN0X3NwZWNfc2V0KHAsIHYxLCB2MiwgdjMsIHY0LCB2NSk7Ci0jZWxzZQotICAgICAgICBwcmludGsoIm12X2N1c3QgbW9kdWxlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBVRFAgU0FNUExFIENvbmZpZyBTdXBwb3J0XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJvbWNpX3NldCIpKSB7Ci0gICAgICAgIG12X2N1c3Rfb21jaV9zZXQocCwgdjEsIHYyLCB2Myk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcHJpbnRrKCIlczogaWxsZWdhbCBvcGVyYXRpb24gPCVzPlxuIiwgX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOwotCi0gICAgcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotICAgIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIqICAgICAgICBuYW1lID0gYXR0ci0+YXR0ci5uYW1lOwotICAgIHVuc2lnbmVkIGludCAgICAgICB2MT0wLCB2Mj0wLCB2Mz0wLCB2ND0wLCB2NT0wLCB2Nj0wLCB2Nz0wLCB2OD0wOwotICAgIHVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKLSAgICBtdl9jdXN0X2lvY3RsX2Zsb3dfbWFwX3QgY3VzdF9mbG93OwotCi0gICAgaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotICAgICAgICByZXR1cm4gLUVQRVJNOwotCi0gICAgLyogUmVhZCBpbnB1dCAqLwotICAgIHNzY2FuZihidWYsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCIsICZ2MSwgJnYyLCAmdjMsICZ2NCwgJnY1LCAmdjYsICZ2NywgJnY4KTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUgICAKLQotICAgIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9kZWJ1ZyIpKSB7Ci0gICAgICAgIG12X2N1c3Rfc2V0X3RyYWNlX2ZsYWcoKHVpbnQzMl90KXYxKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiZmxvd19tYXBfdXNfc2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LmRpciAgICAgICA9IE1WX0NVU1RfRkxPV19ESVJfVVM7Ci0gICAgICAgIGN1c3RfZmxvdy52aWQgICAgICAgPSB2MTsKLSAgICAgICAgY3VzdF9mbG93LnBiaXRzICAgICA9IHYyOwotICAgICAgICBjdXN0X2Zsb3cubW9kX3ZpZCAgID0gdjM7Ci0gICAgICAgIGN1c3RfZmxvdy5tb2RfcGJpdHMgPSB2NDsKLSAgICAgICAgCi0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UgICAgICAgID0gMTsKLSAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19wb3J0ICAgICAgPSAobXZfY3VzdF90cmdfcG9ydF90eXBlX3QpdjU7Ci0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUgICAgID0gKHVpbnQzMl90KXY2OwotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX2h3Zl9xdWV1ZSA9ICh1aW50MzJfdCl2NzsgICAgICAgIAotICAgICAgICBjdXN0X2Zsb3cucGt0X2Zyd2QuZ2VtX3BvcnQgICAgICA9IChtdl9jdXN0X2dlbV9wb3J0X2tleV90KXY4OwotICAgICAgICAKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvdyk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZsb3dfbWFwX2RzX3NldCIpKSB7Ci0gICAgICAgIG1lbXNldCgmY3VzdF9mbG93LCAwLCBzaXplb2YoY3VzdF9mbG93KSk7Ci0gICAgICAgIGN1c3RfZmxvdy5kaXIgICAgICAgPSBNVl9DVVNUX0ZMT1dfRElSX0RTOwotICAgICAgICBjdXN0X2Zsb3cudmlkICAgICAgID0gdjE7Ci0gICAgICAgIGN1c3RfZmxvdy5wYml0cyAgICAgPSB2MjsKLSAgICAgICAgY3VzdF9mbG93Lm1vZF92aWQgICA9IHYzOwotICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzID0gdjQ7Ci0gICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UgICAgPSAxOwotICAgICAgICAKLSAgICAgICAgbXZfY3VzdF9tYXBfcnVsZV9zZXQoJmN1c3RfZmxvdyk7Ci0gICAgfSAgICAKLSAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJmbG93X21hcF9kZWwiKSkgewotICAgICAgICBtdl9jdXN0X21hcF9ydWxlX2RlbCgodWludDE2X3QpdjEsICh1aW50OF90KXYyLCAobXZfY3VzdF9mbG93X2Rpcl9lKXYzKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAidGFnX2Zsb3dfZ2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LnZpZCAgID0gdjE7Ci0gICAgICAgIGN1c3RfZmxvdy5wYml0cyA9IHYyOyAgIAotICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSAobXZfY3VzdF9mbG93X2Rpcl9lKXYzOyAgICAgICAgCi0gICAgICAgIG12X2N1c3RfdGFnX21hcF9ydWxlX2dldCgmY3VzdF9mbG93KTsKLSAgICAgICAgcHJpbnRrKCJpbl91c2VbJWRdLCBtb2RfdmlkWyVkXSBtb2RfcGJpdHNbJWRdIHRyZ19wb3J0WyVkXSwgdHJnX3F1ZXVlWyVkXSwgZ2VtX3BvcnRbJWRdXHJcbiIsCi0gICAgICAgICAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLmluX3VzZSwgY3VzdF9mbG93Lm1vZF92aWQsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5tb2RfcGJpdHMsIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcG9ydCwgCi0gICAgICAgICAgICAgICAgY3VzdF9mbG93LnBrdF9mcndkLnRyZ19xdWV1ZSwgY3VzdF9mbG93LnBrdF9mcndkLmdlbV9wb3J0KTsKLSAgICB9ICAgIAotICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVudGFnX2Zsb3dfZ2V0IikpIHsKLSAgICAgICAgbWVtc2V0KCZjdXN0X2Zsb3csIDAsIHNpemVvZihjdXN0X2Zsb3cpKTsKLSAgICAgICAgY3VzdF9mbG93LmRzY3AgID0gIHYxOwotICAgICAgICBjdXN0X2Zsb3cuZGlyICAgPSAobXZfY3VzdF9mbG93X2Rpcl9lKXYyOyAgICAgICAgCi0gICAgICAgIG12X2N1c3RfdW50YWdfbWFwX3J1bGVfZ2V0KCZjdXN0X2Zsb3cpOyAgICAKLSAgICAgICAgcHJpbnRrKCJpbl91c2VbJWRdLCBtb2RfdmlkWyVkXSBtb2RfcGJpdHNbJWRdIHRyZ19wb3J0WyVkXSwgdHJnX3F1ZXVlWyVkXSwgZ2VtX3BvcnRbJWRdXHJcbiIsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC5pbl91c2UsIGN1c3RfZmxvdy5tb2RfdmlkLCAKLSAgICAgICAgICAgICAgICBjdXN0X2Zsb3cubW9kX3BiaXRzLCBjdXN0X2Zsb3cucGt0X2Zyd2QudHJnX3BvcnQsIAotICAgICAgICAgICAgICAgIGN1c3RfZmxvdy5wa3RfZnJ3ZC50cmdfcXVldWUsIGN1c3RfZmxvdy5wa3RfZnJ3ZC5nZW1fcG9ydCk7ICAgICAgICAKLSAgICB9ICAgICAgCi0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0jZW5kaWYKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBtdl9jdXN0X3NwZWNfcHJvY182aF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBjaGFyKiAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgdjE9MCwgdjI9MCwgdjM9MCwgdjQ9MCwgdjU9MCwgdjY9MDsKLSAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgc3NjYW5mKGJ1ZiwgIiV4ICV4ICV4ICV4ICV4ICV4IiwgJnYxLCAmdjIsICZ2MywgJnY0LCAmdjUsICZ2Nik7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0gICAgaWYgKCFzdHJjbXAobmFtZSwgImVvYW1fbWFjIikpIHsKLSAgICAgICAgZW9hbV9tYWNbMF0gPSAodWludDhfdCl2MTsKLSAgICAgICAgZW9hbV9tYWNbMV0gPSAodWludDhfdCl2MjsKLSAgICAgICAgZW9hbV9tYWNbMl0gPSAodWludDhfdCl2MzsKLSAgICAgICAgZW9hbV9tYWNbM10gPSAodWludDhfdCl2NDsKLSAgICAgICAgZW9hbV9tYWNbNF0gPSAodWludDhfdCl2NTsKLSAgICAgICAgZW9hbV9tYWNbNV0gPSAodWludDhfdCl2NjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBwcmludGsoIiVzOiBpbGxlZ2FsIG9wZXJhdGlvbiA8JXM+XG4iLCBfX0ZVTkNUSU9OX18sIGF0dHItPmF0dHIubmFtZSk7Ci0KLSAgICByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0gICAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3QgbXZfY3VzdF9zcGVjX3Byb2NfNjRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciogICAgICAgICAgbmFtZSA9IGF0dHItPmF0dHIubmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICB2WzY0XTsKLSAgICB1bnNpZ25lZCBpbnQgICAgICAgICBpbmRleCA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgZmxhZ3M7Ci0gICAgbXZfY3VzdF9kc2NwX3BiaXRzX3QgZHNjcF9tYXA7Ci0KLSAgICBpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0gICAgICAgIHJldHVybiAtRVBFUk07Ci0KLSAgICAvKiBSZWFkIGlucHV0ICovCi0gICAgZm9yIChpbmRleD0wOyBpbmRleDw2NDsgaW5kZXgrKykgewotICAgICAgICBzc2NhbmYoYnVmLCAiJWQiLCAmdltpbmRleF0pOwotICAgICAgICBkc2NwX21hcC5wYml0c1tpbmRleF0gPSAodWludDhfdCl2W2luZGV4XTsKLSAgICB9Ci0gICAgZHNjcF9tYXAuaW5fdXNlID0gMTsKLQotICAgIHJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLSAgICBpZiAoIXN0cmNtcChuYW1lLCAiZHNjcF9tYXBfc2V0IikpIHsKLSNpZmRlZiBDT05GSUdfTVZfQ1VTVF9GTE9XX01BUF9IQU5ETEUgICAgICAgCi0gICAgICAgIG12X2N1c3RfZHNjcF9tYXBfc2V0KCZkc2NwX21hcCk7Ci0jZW5kaWYgICAgICAgIAotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHByaW50aygiJXM6IGlsbGVnYWwgb3BlcmF0aW9uIDwlcz5cbiIsIF9fRlVOQ1RJT05fXywgYXR0ci0+YXR0ci5uYW1lKTsKLQotICAgIHJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoaGVscCwgICAgICAgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGRlYnVnLCAgICAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKG9tY2lfc2V0LCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihlb2FtX2doX2tlZXAsICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMV9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZW9hbV90eHEsICAgICAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzFfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGVvYW1fbWFjLCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182aF9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZW9hbV93cml0ZSwgICAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzFfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodGNvbnRfc2hvdywgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHRjb250X3NldCwgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18yX3N0b3JlKTsKLQotc3RhdGljIERFVklDRV9BVFRSKGFwcF9zaG93LCAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY18xX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihhcHBfZmxhZ19zZXQsICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfMl9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoYXBwX2V0eXBlX3NldCwgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzJfc3RvcmUpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodWRwX3BvcnRzLCAgICAgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKHVkcF9zcmMsICAgICAgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY182X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1ZHBfZHN0LCAgICAgICAgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfNl9zdG9yZSk7Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcCwgICAgICAgU19JUlVTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfc2hvdywgIFNfSVJVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIE5VTEwpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX2NsZWFyLCBTX0lSVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBOVUxMKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihkc2NwX21hcF9kZWwsICAgU19JUlVTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgTlVMTCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfZGVidWcsIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKGZsb3dfbWFwX3VzX3NldCxTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihmbG93X21hcF9kc19zZXQsU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZmxvd19tYXBfZGVsLCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jX2Zsb3dfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHRhZ19mbG93X2dldCwgICBTX0lXVVNSLCBtdl9jdXN0X3NwZWNfcHJvY19zaG93LCBtdl9jdXN0X3NwZWNfcHJvY19mbG93X3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUih1bnRhZ19mbG93X2dldCwgU19JV1VTUiwgbXZfY3VzdF9zcGVjX3Byb2Nfc2hvdywgbXZfY3VzdF9zcGVjX3Byb2NfZmxvd19zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIoZHNjcF9tYXBfc2V0LCAgIFNfSVdVU1IsIG12X2N1c3Rfc3BlY19wcm9jX3Nob3csIG12X2N1c3Rfc3BlY19wcm9jXzY0X3N0b3JlKTsKLQotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbXZfY3VzdF9zcGVjX3Byb2NfYXR0cnNbXSA9IHsKLSAgICAmZGV2X2F0dHJfaGVscC5hdHRyLCAgICAKLSAgICAmZGV2X2F0dHJfZGVidWcuYXR0ciwKLSAgICAmZGV2X2F0dHJfb21jaV9zZXQuYXR0ciwKLSAgICAmZGV2X2F0dHJfZW9hbV9naF9rZWVwLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fdHhxLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fbWFjLmF0dHIsCi0gICAgJmRldl9hdHRyX2VvYW1fd3JpdGUuYXR0ciwKLSAgICAmZGV2X2F0dHJfdGNvbnRfc2hvdy5hdHRyLAotICAgICZkZXZfYXR0cl90Y29udF9zZXQuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX2FwcF9zaG93LmF0dHIsCi0gICAgJmRldl9hdHRyX2FwcF9mbGFnX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9hcHBfZXR5cGVfc2V0LmF0dHIsICAgCi0gICAgJmRldl9hdHRyX3VkcF9wb3J0cy5hdHRyLCAgICAKLSAgICAmZGV2X2F0dHJfdWRwX3NyYy5hdHRyLAotICAgICZkZXZfYXR0cl91ZHBfZHN0LmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwX2RlYnVnLmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwX3VzX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF9kc19zZXQuYXR0ciwgICAgCi0gICAgJmRldl9hdHRyX2RzY3BfbWFwX3NldC5hdHRyLAotICAgICZkZXZfYXR0cl9mbG93X21hcF9kZWwuYXR0ciwKLSAgICAmZGV2X2F0dHJfdGFnX2Zsb3dfZ2V0LmF0dHIsCi0gICAgJmRldl9hdHRyX3VudGFnX2Zsb3dfZ2V0LmF0dHIsCi0gICAgJmRldl9hdHRyX2Zsb3dfbWFwLmF0dHIsICAgIAotICAgICZkZXZfYXR0cl9mbG93X21hcF9zaG93LmF0dHIsICAgICAKLSAgICAmZGV2X2F0dHJfZmxvd19tYXBfY2xlYXIuYXR0ciwgICAKLSAgICAmZGV2X2F0dHJfZHNjcF9tYXBfZGVsLmF0dHIsICAgICAgIAotCi0gICAgTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbXZfY3VzdF9zcGVjX3Byb2NfZ3JvdXAgPSB7Ci0gICAgLm5hbWUgPSAicHJvdG8iLAotICAgIC5hdHRycyA9IG12X2N1c3Rfc3BlY19wcm9jX2F0dHJzLAotfTsKLQotaW50IG12Y3VzdF9zeXNmc19pbml0KHZvaWQpCi17Ci0gICAgaW50IGVycjsKLSAgICBzdHJ1Y3QgZGV2aWNlICpwZDsKLQotICAgIHBkID0gYnVzX2ZpbmRfZGV2aWNlX2J5X25hbWUoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCAiY3VzdCIpOwotICAgIGlmICghcGQpIHsKLSAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY3VzdCIsIC0xLCBOVUxMLCAwKTsKLSAgICAgICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjdXN0Iik7Ci0gICAgfQotCi0gICAgaWYgKCFwZCkgewotICAgICAgICBwcmludGsoS0VSTl9FUlIiJXM6IGNhbm5vdCBmaW5kIGN1c3QgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBwZCA9ICZwbGF0Zm9ybV9idXM7Ci0gICAgfQotCi0gICAgZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZC0+a29iaiwgJm12X2N1c3Rfc3BlY19wcm9jX2dyb3VwKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIHByaW50ayhLRVJOX0lORk8gInN5c2ZzIGdyb3VwIGZhaWxlZCAlZFxuIiwgZXJyKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiPSBDVVNUIE1vZHVsZSBTWVMgRlMgSW5pdCBlbmRlZCBzdWNjZXNzZnVsbHkgPVxuIik7Ci0gICAgb3V0OgotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgbXZjdXN0X3N5c2ZzX2RlbGV0ZSh2b2lkKQotewotICAgIHN0cnVjdCBkZXZpY2UgKnBkOwotCi0gICAgcGQgPSBidXNfZmluZF9kZXZpY2VfYnlfbmFtZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsICJjdXN0Iik7Ci0gICAgaWYgKCFwZCkKLSAgICB7Ci0gICAgICAgIHByaW50ayhLRVJOX0VSUiIlczogY2Fubm90IGZpbmQgQ1VTVCBkZXZpY2VcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzeXNmc19yZW1vdmVfZ3JvdXAoJnBkLT5rb2JqLCAmbXZfY3VzdF9zcGVjX3Byb2NfZ3JvdXApOwotCi0gICAgcHJpbnRrKEtFUk5fSU5GTyAiPSBDVVNUIE1vZHVsZSBTWVMgRlMgUmVtb3ZlIGVuZGVkIHN1Y2Nlc3NmdWxseSA9XG4iKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfZXp4bWwvZXp4bWxfcmVhZG1lLnR4dCBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfZXp4bWwvZXp4bWxfcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTcyYWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9lenhtbC9lenhtbF9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTkgQEAKK2V6eG1sLmMNCisxLglPcmlnaW5hbCBmaWxlIGxpbmUgMjUsIHJlbW92ZWQgkyNpbmNsdWRlIDxzdGRsaWIuaD6ULCBpdCBpcyBmb3IgdXNlciBzcGFjZQ0KKzIuCU9yaWdpbmFsIGZpbGUgbGluZSAzMiwgcmVtb3ZlZCCTI2lmbmRlZiBFWlhNTF9OT01NQVCUIGJsb2NrLCBhbmQgYWRkIGxpbnV4IGtlcm5lbCBoZWFkZXIgZmlsZXMNCiszLglPcmlnaW5hbCBmaWxlIGxpbmUgMzgsIGFkZGVkIGZ1bmN0aW9uIGV6eG1sX3JlYWxsb2MvbWFsbG9jL3JlYWxsb2MvZnJlZS9zdGF0IGRlZmluaXRpb25zDQorNC4JT3JpZ2luYWwgZmlsZSBsaW5lIDU5LCBhZGRlZCBmdW5jdGlvbiBzdHJkdXANCis1LglPcmlnaW5hbCBmaWxlIGxpbmUgNjA0LCByZW1vdmUgZnVuY3Rpb24gZXp4bWxfcGFyc2VfZnANCis2LglPcmlnaW5hbCBmaWxlIGxpbmUgNjI2LCBjaGFuZ2VkIGV6eG1sX3BhcnNlX2ZkIGltcGxlbWVudGF0aW9uIHRvIGtlcm5lbCBzdHlsZQ0KKzcuCU9yaWdpbmFsIGZpbGUgbGluZSA2NTYsIGNoYW5nZWQgZXp4bWxfcGFyc2VfZmlsZSBpbXBsZW1lbnRhdGlvbiB0byBrZXJuZWwgc3R5bGUNCis4LglPcmlnaW5hbCBmaWxlIGxpbmUgODE0LCByZW1vdmVkIJMjaWZuZGVmIEVaWE1MX05PTU1BUJQgYmxvY2ssIG5vdCB1c2VkIGNvZGUgDQorOS4JT3JpZ2luYWwgZmlsZSBsaW5lIDk5OSwgcmVtb3ZlZCCTI2lmZGVmIEVaWE1MX1RFU1SUIGJsb2NrLCBub3QgdXNlZCBjb2RlIA0KKzEwLglPcmlnaW5hbCBmaWxlIGxpbmUgOTk5LCBhZGRlZCBmdW5jdGlvbiBlenhtbF9yZWFsbG9jIGltcGxlbWVudGF0aW9uDQorIA0KK2V6eG1sLmgNCisxLglPcmlnaW5hbCBmaWxlIGxpbmUgMjgsIHJlbW92ZWQgdXNlciBzcGFjZSBoZWFkZXIgZmlsZXMNCisyLglPcmlnaW5hbCBmaWxlIGxpbmUgNDIsIGFkZGVkIEZJTEUgZGVmaW5pdGlvbg0KKzMuCU9yaWdpbmFsIGZpbGUgbGluZSA2MiwgYWRkZWQgZnVuY3Rpb24gZXp4bWxfdCBlenhtbF9wYXJzZV9maWxlKCBjaGFyICpmaWxlKSBkZWNsYXJhdGlvbg0KKzQuCU9yaWdpbmFsIGZpbGUgbGluZSA2MiwgYWRkZWQgkyNpZmRlZiBFWlhNTF9URVNUlCANCis1LglPcmlnaW5hbCBmaWxlIGxpbmUgNjgsIHJlbW92ZWQgZnVuY3Rpb24gZXp4bWxfdCBlenhtbF9wYXJzZV9maWxlKCBjaGFyICpmaWxlKSBkZWNsYXJhdGlvbg0KKzYuCU9yaWdpbmFsIGZpbGUgbGluZSAxMjIsIDEzMCwgMTM3LCAxNDUsIGNoYW5nZWQgc3RyZHVwIHRvIE1NUF9PU19TVFJEVVANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5jCmluZGV4IDg2ZDg0OTQuLjRkNTQwMjkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfbmV0YS9uZXRfZGV2L212X25ldGRldi5jCkBAIC02NjMsOSArNjYzLDYgQEAKIAlpZiAocHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAocHAgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAl0eHFfY3RybCA9ICZwcC0+dHhxX2N0cmxbdHhwICogQ09ORklHX01WX0VUSF9UWFEgKyB0eHFdOwogCWlmICh0eHFfY3RybC0+Y3B1X293bmVyKSB7CiAJCW1vZGUgPSBNVl9FVEhfVFhRX0NQVTsKQEAgLTgyNiw3ICs4MjMsNyBAQAogI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAogLyogUmVnaXN0ZXIgc3BlY2lhbCB0cmFuc21pdCBjaGVjayBmdW5jdGlvbiAqLwogdm9pZCBtdl9ldGhfcnhfc3BlY2lhbF9wcm9jX2Z1bmMoaW50IHBvcnQsIHZvaWQgKCpmdW5jKShpbnQgcG9ydCwgaW50IHJ4cSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKSkKKwkJCQkJCQlzdHJ1Y3QgZXRoX3BidWYgKnBrdCwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpCiB7CiAJc3RydWN0IGV0aF9wb3J0ICpwcCA9IG12X2V0aF9wb3J0X2J5X2lkKHBvcnQpOwogCkBAIC0xNjIwLDEzICsxNjE3LDEzIEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19NVl9FVEhfUE5DKSAmJiBkZWZpbmVkKENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTCkKIAkJLyogU3BlY2lhbCBSWCBwcm9jZXNzaW5nICovCi0jaWZkZWYgQ09ORklHX01WX0NVU1RfRkxPV19NQVBfSEFORExFCisjaWZkZWYgQ09ORklHX01WX0NQSF9GTE9XX01BUF9IQU5ETEUKIAkJaWYgKChNVl9QT05fUE9SVF9JRCA9PSBwcC0+cG9ydCkgfHwgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKSkgewogI2Vsc2UKIAkJaWYgKHJ4X2Rlc2MtPnBuY0luZm8gJiBORVRBX1BOQ19SWF9TUEVDSUFMKSB7CiAjZW5kaWYKIAkJCWlmIChwcC0+cnhfc3BlY2lhbF9wcm9jKSB7Ci0JCQkJcHAtPnJ4X3NwZWNpYWxfcHJvYyhwcC0+cG9ydCwgcnhxLCBkZXYsIChzdHJ1Y3Qgc2tfYnVmZiAqKShwa3QtPm9zSW5mbyksIHJ4X2Rlc2MpOworCQkJCXBwLT5yeF9zcGVjaWFsX3Byb2MocHAtPnBvcnQsIHJ4cSwgZGV2LCBwa3QsIHJ4X2Rlc2MpOwogCQkJCVNUQVRfSU5GTyhwcC0+c3RhdHMucnhfc3BlY2lhbCsrKTsKIAogICAgICAgICAgICAgICAgIGlmIChyeF9kZXNjLT5wbmNJbmZvICYgTkVUQV9QTkNfUlhfU1BFQ0lBTCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9uZXRhL25ldF9kZXYvbXZfbmV0ZGV2LmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaAppbmRleCA2MDdhNGJjLi40YjRkMmJkIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X25ldGEvbmV0X2Rldi9tdl9uZXRkZXYuaApAQCAtMzMzLDcgKzMzMyw3IEBACiAjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9DU1VNX09GRkxPQUQgKi8KICNpZmRlZiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwKIAl2b2lkICAgICgqcnhfc3BlY2lhbF9wcm9jKShpbnQgcG9ydCwgaW50IHJ4cSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYyk7CisJCQkJCXN0cnVjdCBldGhfcGJ1ZiAqcGt0LCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKTsKICNlbmRpZiAvKiBDT05GSUdfTVZfRVRIX1JYX1NQRUNJQUwgKi8KICNpZmRlZiBDT05GSUdfTVZfRVRIX1RYX1NQRUNJQUwKIAlpbnQgICAgICgqdHhfc3BlY2lhbF9jaGVjaykoaW50IHBvcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC03MjMsNyArNzIzLDcgQEAKIAogI2lmZGVmIENPTkZJR19NVl9FVEhfUlhfU1BFQ0lBTAogdm9pZCAgICAgICAgbXZfZXRoX3J4X3NwZWNpYWxfcHJvY19mdW5jKGludCBwb3J0LCB2b2lkICgqZnVuYykoaW50IHBvcnQsIGludCByeHEsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGFfcnhfZGVzYyAqcnhfZGVzYykpOworCQkJCQkJCXN0cnVjdCBldGhfcGJ1ZiAqcGt0LCBzdHJ1Y3QgbmV0YV9yeF9kZXNjICpyeF9kZXNjKSk7CiAjZW5kaWYgLyogQ09ORklHX01WX0VUSF9SWF9TUEVDSUFMICovCiAKICNpZmRlZiBDT05GSUdfTVZfTUFDX0xFQVJOCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuYwppbmRleCA5ZWE3ZDU5Li5lYjk2OTc5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmMKQEAgLTgwNiw5ICs4MDYsMjMgQEAKIAl9DQogfQ0KIA0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpMmtTdXBwb3J0ZWRTZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyAySyBieXRlIHBhY2tldHMgc3VwcG9ydGVkIG9uIE1DIGJvYXJkDQorKioNCisqKiAgUEFSQU1FVEVSUzogIHBrdDJrU3VwcG9ydGVkIC0gMksgYnl0ZSBlbmFibGUgb3IgZGlzYWJsZQ0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UNCisqKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQogTVZfU1RBVFVTIG12RXBvbkFwaTJrU3VwcG9ydGVkU2V0KE1WX1UzMiBwa3Qya1N1cHBvcnRlZCkNCiB7DQotICAgIE1WX1NUQVRVUyBzdGF0dXMgPSAwOw0KKyAgICBNVl9TVEFUVVMgc3RhdHVzOw0KICAgICBNVl9VMzIgICAgZGV2SWQ7DQogDQogICAgIGRldklkID0gbXZDdHJsTW9kZWxHZXQoKTsNCkBAIC04MzUsNCArODQ5LDI5MiBAQAogICAgIHJldHVybiAoc3RhdHVzKTsNCiB9DQogDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlMb3NUaW1lQ29uZmlnDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGltZSBkdXJhdGlvbiB0byBleHBpcmUgZm9yIGVudGVyaW5nIGhvbGRvdmVyDQorKioNCisqKiAgUEFSQU1FVEVSUzogIG9wdGljYWxMb3NUaW1lIC0gdGltZSBkdXJhdGlvbiB3aGVuIG5vIG9wdGljYWwgc2lnbmFsIGRldGVjdGVkDQorKiogICAgICAgICAgICAgICBtYWNMb3NUaW1lICAgICAtIHRpbWUgZHVyYXRpb24gd2hlbiBubyBHQVRFIE1QQ1BEVSByZWNlaXZlZA0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UNCisqKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaUxvc1RpbWVDb25maWcoTVZfVTE2IG9wdGljYWxMb3NUaW1lLCBNVl9VMTYgbWFjTG9zVGltZSkNCit7DQorICAgIE1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsNCisgICAgDQorICAgIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KG9wdGljYWxMb3NUaW1lKTsNCisgICAgb251RXBvbkRiT251TWFjTG9zVGltZVNldChtYWNMb3NUaW1lKTsNCisNCisgICAgLyogSWYgdGhlIGhvbGRvdmVyIHRpbWVyIGlzIG5vdCBhY3RpdmUsIHdlIGFkZCB0aGUgT3B0aWNhbExvc1RpbWVyIHRvIHRoZSBob2xkb3ZlciB0aW1lIGFuZCBzYXZlICovDQorICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udVBvbkhvbGRvdmVyVGltZXJJZC5vbnVQb25UaW1lckFjdGl2ZSA9PSBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUpDQorICAgIHsNCisgICAgICAgIC8qIEFkZCB0aGUgY29uZmlndXJlZCBPcHRMb3NUaW1lIHRvIGhvbGRvdmVyIHRpbWUgYW5kIHNhdmUgZm9yIG5leHQgaG9sZG92ZXIgKi8NCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVQb25Ib2xkb3ZlclRpbWVySWQpLCAwLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udUhvbGRvdmVyVGltZUdldCgpICsgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQoKSwgMCk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlUeFBvd2VyQ3RybENvbmZpZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb250cm9scyB0aGUgVFggcG93ZXIgb24gYW5kIG9mZg0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBhY3Rpb24gLSB0dXJuIG9uIGFuZCB0dXJuIG9mZiB0aGUgVFggcG93ZXIsIG9yIHR1cm4gb2ZmIGFmdGVyIA0KKyoqICAgICAgICAgICAgICAgICAgICAgICAgY2VydGFpbiB0aW1lIGR1cmF0aW9uLg0KKyoqICAgICAgICAgICAgICAgdGltZSAgIC0gdGltZSBkdXJhdGlvbiB0byBiZSBleHBpcmVkIGJlZm9yZSB0dXJuaW5nIG9mZiBUWA0KKyoqDQorKiogIE9VVFBVVFM6ICAgICBOb25lDQorKioNCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkxBU0UNCisqKg0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG12RXBvbkFwaVR4UG93ZXJDdHJsQ29uZmlnKE1WX1UxNiBhY3Rpb24sIE1WX1UxNiB0aW1lKQ0KK3sNCisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOw0KKyAgICANCisgICAgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRU5BQkxFX1RYKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UeFBvd2VyT24oTVZfVFJVRSk7DQorICAgIH0NCisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfRVBPTl9JT0NUTF9ESVNBQkxFX1RYKQ0KKyAgICB7DQorICAgICAgICBvbnVQb25UeFBvd2VyT24oTVZfRkFMU0UpOw0KKyAgICB9DQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRElTQUJMRV9UWF9ERUxBWSkNCisgICAgeyAgICAgICAgDQorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpLCAwLCB0aW1lLCAxKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gc3RhdHVzOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaVBvd2VyU2F2aW5nQ29uZmlnDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBhcmFtZXRlcnMgZm9yIHBvd2VyIHNhdmluZyBtb2RlDQorKioNCisqKiAgUEFSQU1FVEVSUzogIGVhcmx5V2FrZXVwIC0gc2V0IHRoZSBhYmlsaXR5IG9mIHN1cHBvcnRpbmcgZWFybHkgd2FrZSB1cA0KKyoqICAgICAgICAgICAgICAgbWF4U2xlZXBEdXJhdGlvbiAtIHRpbWUgcGVyaW9kIGZvciBrZWVwaW5nIHBvd2VyIHNhdmluZyBtb2RlDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GTEFTRQ0KKyoqDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpUG93ZXJTYXZpbmdDb25maWcoTVZfVTggZWFybHlXYWtldXAsIE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKQ0KK3sNCisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOw0KKyAgICANCisgICAgaWYgKChvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCkgKyBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCgpKQ0KKyAgICAgICAgPj0gbWF4U2xlZXBEdXJhdGlvbikNCisgICAgew0KKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfSU5GTywgUE9OX0FQSV9NT0RVTEUsDQorCQkJICAgICAgICJFUlJPUjogV3JvbmcgcGFyYW1ldGVycywgc2xlZXAoJWQpICsgd2FrZXVwKCVkKSA+PSBtYXhTbGVlcER1cmF0aW9uKCVkKVxyXG4iLCANCisJCQkgICAgICAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpLCBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCgpLCANCisJCQkgICAgICAgbWF4U2xlZXBEdXJhdGlvbik7DQorICAgICAgICANCisgICAgICAgIHJldHVybiBNVl9CQURfUEFSQU07DQorICAgIH0NCisNCisgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBTZXQoZWFybHlXYWtldXApOw0KKyAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25TZXQobWF4U2xlZXBEdXJhdGlvbik7DQorDQorICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpDQorICAgIHsNCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTbGVlcER1cmF0aW9uLCAxKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gc3RhdHVzOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29udHJvbHMgc2xlZXAgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICBlbmFibGUgLSB0dXJuIG9mZiBhbmQgdHVybiBvbiB0aGUgVFggb3IgUlgNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKiAgUmVmOiAgICAgICAgIENhbGxlZCBieSBtdkVwb25BcGlTbGVlcEN0cmxFbmFibGUsIG12RXBvbkFwaVNsZWVwQ3RybERpc2FibGUsIA0KKyoqICAgICAgICAgICAgICAgbXZFcG9uQXBpU2xlZXBDdHJsQ2ZnLCBvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwsIA0KKyoqICAgICAgICAgICAgICAgb251RXBvblNsZWVwV2FrZUR1cmF0aW9uVGltZXJIbmRsDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9VMzIgZW5hYmxlKQ0KK3sNCisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOw0KKyAgICANCisgICAgaWYgKG9udUVwb25EYk9udVNsZWVwTW9kZUdldCgpID09IEVfRVBPTl9TTEVFUF9NT0RFX0NUUkxfVFgpDQorICAgIHsNCisgICAgICAgIGlmIChlbmFibGUgPT0gTVZfVFJVRSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0dXMgfD0gb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0dXMgfD0gb251UG9uVHhQb3dlck9uKE1WX1RSVUUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UgaWYgKG9udUVwb25EYk9udVNsZWVwTW9kZUdldCgpID09IEVfRVBPTl9TTEVFUF9NT0RFX0NUUkxfVFhfUlgpDQorICAgIHsNCisgICAgICAgIGlmIChlbmFibGUgPT0gTVZfVFJVRSkNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0dXMgfD0gb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsNCisgICAgICAgICAgICBzdGF0dXMgfD0gbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlKE1WX0ZBTFNFKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBzdGF0dXMgfD0gb251UG9uVHhQb3dlck9uKE1WX1RSVUUpOw0KKyAgICAgICAgICAgIHN0YXR1cyB8PSBtdk9udUVwb25NYWNTZXJkZXNQdVJ4V3JpdGUoTVZfVFJVRSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuIHN0YXR1czsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgT05VIHRvIGxlYXZlIHRoZSBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICANCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlKCkNCit7ICAgDQorICAgIC8qIFN0b3AgbWF4IHNsZWVwIHRpbWVyICovDQorICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpDQorICAgIHsNCisgICAgICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCkpOw0KKyAgICB9DQorDQorICAgIC8qIFN0b3Agc2xlZXAvd2FrZXVwIGR1cmF0aW9uIHRpbWVyICovDQorICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZC5vbnVQb25UaW1lckFjdGl2ZSA9PSBPTlVfUE9OX1RJTUVSX0FDVElWRSkNCisgICAgew0KKyAgICAgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpKTsNCisgICAgfQ0KKw0KKyAgICAvKiBFbmFibGUgVFgvUlggcG93ZXIgKi8NCisgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9GQUxTRSk7DQorDQorICAgIC8qIExlYXZlIHRoZSBwb3dlciBzYXZpbmcgc3RhdHVzICovDQorICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9OT1RfUE9XRVJfU0FWSU5HX1NUQVRVUyk7DQorDQorICAgIHJldHVybihNVl9PSyk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgbXZFcG9uQXBpU2xlZXBDdHJsRW5hYmxlDQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKg0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgT05VIHRvIGVudGVyIHRoZSBwb3dlciBzYXZpbmcgbW9kZQ0KKyoqDQorKiogIFBBUkFNRVRFUlM6ICANCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxFbmFibGUoKQ0KK3sNCisgICAgLyogcmVmcmVzaCBtYXggc2xlZXAgdGltZXIsIG5vIG1hdHRlciBpdCdzIGFjdGl2ZSBvciBub3QgKi8NCisgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpLCAwLCANCisgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uR2V0KCksIDEpOw0KKw0KKyAgICAvKiByZWZyZXNoIHNsZWVwL3dha2V1cCBkdXJhdGlvbiB0aW1lciwgbm8gbWF0dGVyIGl0J3MgYWN0aXZlIG9yIG5vdCAqLw0KKyAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgMCwgDQorICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgMSk7DQorDQorICAgIC8qIGlmIHRoZSBjdXJyZW50IHN0YXR1cyBpcyBub3Qgc2xlZXAsIHRoZW4gZ28gdG8gc2xlZXAgc3RhdHVzICovDQorICAgIGlmIChvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldCgpICE9IEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKQ0KKyAgICB7DQorICAgICAgICAvKiBEaXNhYmxlIFRYL1JYIHBvd2VyICovDQorICAgICAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1RSVUUpOw0KKw0KKyAgICAgICAgLyogdXBkYXRlIHN0YXR1cyB0byBzbGVlcCBzdGF0dXMgKi8NCisgICAgICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKTsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4oTVZfT0spOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG12RXBvbkFwaVNsZWVwQ3RybENmZw0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKioNCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwYXJhbWV0ZXJzIHVzZWQgaW4gdGhlIHBvd2VyIHNhdmluZyBtb2RlDQorKioNCisqKiAgUEFSQU1FVEVSUzogIG1vZGUgLSAwOiBkbyBub3RoaW5nLCAxOiB0dXJuIG9mZiBUeCwgMjogdHVybiBvZmYgVHggYW5kIFJ4DQorKiogICAgICAgICAgICAgICBzbGVlcER1cmF0aW9uIC0gdGltZSBkdXJhdGlvbiBmb3Iga2VlcGluZyBzbGVlcA0KKyoqICAgICAgICAgICAgICAgd2FrZXVwRHVyYXRpb24gLSB0aW1lIGR1cmF0aW9uIGZvciBiZWluZyB3YWtldXANCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFDQorKioNCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxDZmcoTVZfVTggbW9kZSwgTVZfVTMyIHNsZWVwRHVyYXRpb24sIE1WX1UzMiB3YWtldXBEdXJhdGlvbikNCit7DQorICAgIGlmICgoc2xlZXBEdXJhdGlvbiArIHdha2V1cER1cmF0aW9uKSA+PSBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQoKSkNCisgICAgew0KKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLA0KKwkJCSAgICAgICAiRVJST1I6IFdyb25nIHBhcmFtZXRlcnMsIHNsZWVwKCVkKSArIHdha2V1cCglZCkgPj0gbWF4U2xlZXBEdXJhdGlvbiglZClcclxuIiwgDQorCQkJICAgICAgIHNsZWVwRHVyYXRpb24sIHNsZWVwRHVyYXRpb24sIA0KKwkJCSAgICAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQoKSk7DQorICAgICAgICANCisgICAgICAgIHJldHVybiBNVl9CQURfUEFSQU07DQorICAgIH0NCisNCisgICAgLyogc2F2ZSBwYXJhdGVycyBpbnRvIERCICovDQorICAgIG9udUVwb25EYk9udVNsZWVwTW9kZVNldChtb2RlKTsNCisgICAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvblNldChzbGVlcER1cmF0aW9uKTsNCisgICAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25TZXQod2FrZXVwRHVyYXRpb24pOw0KKw0KKyAgICAvKiByZWZyZXNoIG1heCBzbGVlcCB0aW1lciwgbm8gbWF0dGVyIGl0J3MgYWN0aXZlIG9yIG5vdCAqLw0KKyAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCksIDAsIA0KKyAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQoKSwgMSk7DQorDQorICAgIC8qIHJlZnJlc2ggc2xlZXAvd2FrZXVwIGR1cmF0aW9uIHRpbWVyLCBubyBtYXR0ZXIgaXQncyBhY3RpdmUgb3Igbm90ICovDQorICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpLCAwLCANCisgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldCgpLCAxKTsNCisNCisgICAgLyogaWYgdGhlIGN1cnJlbnQgc3RhdHVzIGlzIG5vdCBzbGVlcCwgdGhlbiBnbyB0byBzbGVlcCBzdGF0dXMgKi8NCisgICAgaWYgKG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0KCkgIT0gRV9FUE9OX1BPV0VSX1NBVklOR19TTEVFUF9TVEFUVVMpDQorICAgIHsNCisgICAgICAgIC8qIERpc2FibGUgVFgvUlggcG93ZXIgKi8NCisgICAgICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVFJVRSk7DQorDQorICAgICAgICAvKiB1cGRhdGUgc3RhdHVzIHRvIHNsZWVwIHN0YXR1cyAqLw0KKyAgICAgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoRV9FUE9OX1BPV0VSX1NBVklOR19TTEVFUF9TVEFUVVMpOw0KKyAgICB9DQorDQorICAgIHJldHVybihNVl9PSyk7DQorfQ0KKw0KIA0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUFwaS5oCmluZGV4IDllMjM5ODQuLjc1OTBkYWYgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251QXBpLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVBcGkuaApAQCAtODMsNiArODMsNyBAQAogDQogLyogSW5jbHVkZSBGaWxlcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorI2luY2x1ZGUgImVwb25PbnVEYi5oIg0KICANCiAvKiBEZWZpbml0aW9ucw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovIA0KQEAgLTE0NSw2ICsxNDYsMTQgQEAKIC8qIENvbmZpZyBBUEkgKi8NCiBNVl9TVEFUVVMgbXZFcG9uQXBpMmtTdXBwb3J0ZWRTZXQoTVZfVTMyIHBrdDJrU3VwcG9ydGVkKTsNCiANCitNVl9TVEFUVVMgbXZFcG9uQXBpTG9zVGltZUNvbmZpZyhNVl9VMTYgb3B0aWNhbExvc1RpbWUsIE1WX1UxNiBtYWNMb3NUaW1lKTsNCitNVl9TVEFUVVMgbXZFcG9uQXBpVHhQb3dlckN0cmxDb25maWcoTVZfVTE2IGFjdGlvbiwgTVZfVTE2IHRpbWUpOw0KK01WX1NUQVRVUyBtdkVwb25BcGlQb3dlclNhdmluZ0NvbmZpZyhNVl9VOCBlYXJseVdha2V1cCwgTVZfVTY0IG1heFNsZWVwRHVyYXRpb24pOw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX1UzMiBlbmFibGUpOw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlKHZvaWQpOw0KK01WX1NUQVRVUyBtdkVwb25BcGlTbGVlcEN0cmxFbmFibGUodm9pZCk7DQorTVZfU1RBVFVTIG12RXBvbkFwaVNsZWVwQ3RybENmZyhNVl9VOCBtb2RlLCBNVl9VMzIgc2xlZXBEdXJhdGlvbiwgTVZfVTMyIHdha2V1cER1cmF0aW9uKTsNCisNCiAvKiBNYWNyb3MNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmMKaW5kZXggYzViY2YzYi4uM2JmNmI1NyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuYwpAQCAtMjgyLDExICsyODIsMTkgQEAKIA0KIAkvKiBzZXQgaG9sZG92ZXIgKi8NCiAJb251RXBvbkRiT251SG9sZG92ZXJTdGF0ZVNldChPTlVfSE9MRE9WRVJfTk9UX0FDVElWRSk7DQorICAgIG9udUVwb25EYk9udUhvbGRvdmVyVGltZVNldChPTlVfUE9OX1RJTUVSX0hPTERPVkVSX0lOVEVSVkFMKTsNCisgICAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVTZXQoMCk7DQorDQorICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldChPTlVfUE9OX1RJTUVSX01BWF9TTEVFUF9JTlRFUlZBTCk7DQorICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0KDApOw0KKyAgICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVTZXQoRV9FUE9OX1NMRUVQX01PREVfQ1RSTF9UWCk7DQorICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoT05VX1BPTl9USU1FUl9TTEVFUF9EVVJBVElPTik7DQorICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uU2V0KE9OVV9QT05fVElNRVJfV0FLRVVQX0RVUkFUSU9OKTsNCisgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoRV9FUE9OX05PVF9QT1dFUl9TQVZJTkdfU1RBVFVTKTsNCiANCiAJLyogc2V0IHNpbGVuY2UgKi8NCiAJb251RXBvbkRiT251U2lsZW5jZVN0YXRlU2V0KE9OVV9TSUxFTkNFX05PVF9BQ1RJVkUpOw0KIA0KLQ0KIAkvKiBTVyBEQkEgcGFyYW1zICovDQogCW9udUVwb25EYk9udVN3UnBydFRpbWVyVHlwZVNldChPTlVfRVBPTl9TV19EQkFfUlBSVF9USU1FUik7DQogCW9udUVwb25EYk9udVN3UnBydE1hY1RpbWVySW50ZXJ2YWxTZXQoNjI1MDApOyAvKiAxIG1zZWMgaW4gMTZuYW5vIHVuaXRzICovDQpAQCAtMTQ1Myw2ICsxNDYxLDMzMiBAQAogfQ0KIA0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZVNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aW1lIGR1cmF0aW9uIHZhbHVlIGluIGRhdGFiYXNlIA0KKyAqKiAgICAgICAgICAgICAgIHdoZW4gbm8gb3B0aWNhbCBzaWduYWwgaXMgZGV0ZWN0ZWQNCisgKiogICAgICAgICAgICAgICANCisgKiogIFBBUkFNRVRFUlM6ICBsb3NUaW1lIC0gdGltZSBkdXJhdGlvbg0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lU2V0KE1WX1UxNiBsb3NUaW1lKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25PcHRpY2FsTG9zVGltZSA9IGxvc1RpbWU7DQorICAgIA0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGltZSBkdXJhdGlvbiB0byBiZSB1c2VkIA0KKyoqICAgICAgICAgICAgICAgd2hlbiBubyBvcHRpY2FsIHNpZ25hbCBpcyBkZXRlY3RlZA0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgdGltZSBkdXJhdGlvbiB2YWx1ZQ0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udU9wdGljYWxMb3NUaW1lR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbk9wdGljYWxMb3NUaW1lOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251TWFjTG9zVGltZVNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aW1lIGR1cmF0aW9uIHZhbHVlIGluIGRhdGFiYXNlIA0KKyAqKiAgICAgICAgICAgICAgIHdoZW4gbm8gR0FURSBNUENQRFUgaXMgcmVjZWl2ZWQNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICBsb3NUaW1lIC0gdGltZSBkdXJhdGlvbg0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQoTVZfVTE2IGxvc1RpbWUpDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbk1hY0xvc1RpbWUgPSBsb3NUaW1lOw0KKyAgICANCisgICAgcmV0dXJuIE1WX09LOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udU1hY0xvc1RpbWVHZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGltZSBkdXJhdGlvbiB0byBiZSB1c2VkIA0KKyoqICAgICAgICAgICAgICAgd2hlbiBubyBHQVRFIE1QQ1BEVSBpcyByZWNlaXZlZA0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgdGltZSBkdXJhdGlvbiB2YWx1ZQ0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udU1hY0xvc1RpbWVHZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uTWFjTG9zVGltZTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKioNCisgKiogIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0DQorICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorICoqIA0KKyAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBzdXBwb3J0IGZvciBlYXJseSB3YWtldXAgDQorICoqICAgICAgICAgICAgICAgaW4gcG93ZXIgc2F2aW5nIG1vZGUNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICB3YWtlVXBFbmFibGUgLSBFbmFibGUgb3IgZGlzYWJsZSB0aGUgZWFybHkgd2FrZXVwIHN1cHBvcnQNCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cFNldChNVl9VOCB3YWtlVXBFbmFibGUpDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nV2FrZXVwID0gd2FrZVVwRW5hYmxlOw0KKw0KKyAgICByZXR1cm4gKE1WX09LKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ1dha2V1cEdldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3VwcG9ydCBmb3IgZWFybHkgd2FrZXVwDQorKiogICAgICAgICAgICAgICANCisqKiAgUEFSQU1FVEVSUzogIE5vbmUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBlbmFibGUgb3IgZGlzYWJsZQ0KKyoqICAgICAgICAgICAgICAgICAgIA0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfVTMyIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nV2FrZXVwOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0DQorICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorICoqIA0KKyAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBtYXggc2xlZXAgZHVyYXRpb24gDQorICoqICAgICAgICAgICAgICAgaW4gcG93ZXIgc2F2aW5nIG1vZGUNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICBtYXhTbGVlcER1cmF0aW9uIC0gbWF4IHNsZWVwIGR1cmF0aW9uDQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251UG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uU2V0KE1WX1U2NCBtYXhTbGVlcER1cmF0aW9uKQ0KK3sNCisgICAgb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25Qb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb249IG1heFNsZWVwRHVyYXRpb247DQorDQorICAgIHJldHVybiAoTVZfT0spOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvbkdldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4IHNsZWVwIGR1cmF0aW9uIGluIHBvd2VyIHNhdmluZyBtb2RlDQorKiogICAgICAgICAgICAgICANCisqKiAgUEFSQU1FVEVSUzogIE5vbmUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBtYXggc2xlZXAgZHVyYXRpb24NCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uUG93ZXJTYXZpbmdNYXhTbGVlcER1cmF0aW9uOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqKg0KKyAqKiAgb251RXBvbkRiT251U2xlZXBNb2RlU2V0DQorICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorICoqIA0KKyAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIGNvbnRyb2wgbW9kZSBmb3IgcG93ZXIgc2F2aW5nDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgbW9kZSAtIHR1cm4gb2ZmIHR4IG9yIHR4L3J4DQorICoqDQorICoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyAqKg0KKyAqKiAgUkVUVVJOUzogICAgIA0KKyAqKiAgICAgICAgICAgICAgICAgICANCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBNb2RlU2V0KE1WX1U4IG1vZGUpDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblNsZWVwTW9kZSA9IG1vZGU7DQorDQorICAgIHJldHVybiBNVl9PSzsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVTbGVlcE1vZGVHZXQNCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyoqIA0KKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNsZWVwIG1vZGUgZm9yIHBvd2VyIHNhdmluZyBtb2RlDQorKiogICAgICAgICAgICAgICANCisqKiAgUEFSQU1FVEVSUzogIE5vbmUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBzbGVlcCBtb2RlDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitFX0Vwb25TbGVlcEN0cmxNb2RlIG9udUVwb25EYk9udVNsZWVwTW9kZUdldCgpDQorew0KKyAgICByZXR1cm4gb251RXBvbkRiX3Mub251RXBvbkdlblRibF9zLm9udUVwb25TbGVlcE1vZGU7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uU2V0DQorICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorICoqIA0KKyAqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSBwZXJpb2RpY2FsIHNsZWVwIGR1cmF0aW9uIA0KKyAqKiAgICAgICAgICAgICAgIGZvciBwb3dlciBzYXZpbmcNCisgKioNCisgKiogIFBBUkFNRVRFUlM6ICBzbGVlcER1cmF0aW9uIC0gcGVyaW9kaWNhbCBzbGVlcCBkdXJhdGlvbg0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25TZXQoTVZfVTMyIHNsZWVwRHVyYXRpb24pDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb24gPSBzbGVlcER1cmF0aW9uOw0KKw0KKyAgICByZXR1cm4gTVZfT0s7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorKioNCisqKiAgb251RXBvbkRiT251U2xlZXBEdXJhdGlvbkdldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGVyaW9kaWNhbCBzbGVlcCBkdXJhdGlvbiBmb3IgcG93ZXIgc2F2aW5nDQorKiogICAgICAgICAgICAgICANCisqKiAgUEFSQU1FVEVSUzogIE5vbmUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBtYXggc2xlZXAgZHVyYXRpb24NCisqKiAgICAgICAgICAgICAgICAgICANCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1UzMiBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCkNCit7DQorICAgIHJldHVybiBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb247DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyB0aGUgcGVyaW9kaWNhbCB3YWtldXAgZHVyYXRpb24gDQorICoqICAgICAgICAgICAgICAgZm9yIHBvd2VyIHNhdmluZw0KKyAqKg0KKyAqKiAgUEFSQU1FVEVSUzogIHdha2V1cER1cmF0aW9uIC0gcGVyaW9kaWNhbCB3YWtldXAgZHVyYXRpb24NCisgKioNCisgKiogIE9VVFBVVFM6ICAgICBOb25lDQorICoqDQorICoqICBSRVRVUk5TOiAgICAgDQorICoqICAgICAgICAgICAgICAgICAgIA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvblNldChNVl9VMzIgd2FrZXVwRHVyYXRpb24pDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvbldha2V1cER1cmF0aW9uID0gd2FrZXVwRHVyYXRpb247DQorDQorICAgIHJldHVybiBNVl9PSzsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisqKg0KKyoqICBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldA0KKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQorKiogDQorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGVyaW9kaWNhbCB3YWtldXAgZHVyYXRpb24gZm9yIHBvd2VyIHNhdmluZw0KKyoqICAgICAgICAgICAgICAgDQorKiogIFBBUkFNRVRFUlM6ICBOb25lDQorKioNCisqKiAgT1VUUFVUUzogICAgIE5vbmUNCisqKg0KKyoqICBSRVRVUk5TOiAgICAgbWF4IHNsZWVwIGR1cmF0aW9uDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uV2FrZXVwRHVyYXRpb247DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoqDQorICoqICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldA0KKyAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KKyAqKiANCisgKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBwb3dlciBzYXZpbmcgc3RhdHVzDQorICoqDQorICoqICBQQVJBTUVURVJTOiAgc3RhdHVzIC0gbm8gcG93ZXIgc2F2aW5nL3NsZWVwL3dha2V1cA0KKyAqKg0KKyAqKiAgT1VUUFVUUzogICAgIE5vbmUNCisgKioNCisgKiogIFJFVFVSTlM6ICAgICANCisgKiogICAgICAgICAgICAgICAgICAgDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KE1WX1UzMiBzdGF0dXMpDQorew0KKyAgICBvbnVFcG9uRGJfcy5vbnVFcG9uR2VuVGJsX3Mub251RXBvblBvd2VyU2F2aW5nU3RhdHVzID0gc3RhdHVzOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyoqDQorKiogIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzR2V0DQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCisqKiANCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb3dlciBzYXZpbmcgc3RhdHVzDQorKiogICAgICAgICAgICAgICANCisqKiAgUEFSQU1FVEVSUzogIE5vbmUNCisqKg0KKyoqICBPVVRQVVRTOiAgICAgTm9uZQ0KKyoqDQorKiogIFJFVFVSTlM6ICAgICBwb3dlciBzYXZpbmcgc3RhdHVzDQorKiogICAgICAgICAgICAgICAgICAgDQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitNVl9VMzIgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKQ0KK3sNCisgICAgcmV0dXJuIG9udUVwb25EYl9zLm9udUVwb25HZW5UYmxfcy5vbnVFcG9uUG93ZXJTYXZpbmdTdGF0dXM7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKioNCiAqKiAgb251RXBvbkRiT251U2lsZW5jZVN0YXRlU2V0DQogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udURiLmgKaW5kZXggZGYyMDAzZS4uYjJmMjg1ZCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVEYi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251RGIuaApAQCAtODMsNiArODMsNyBAQAogDQogLyogSW5jbHVkZSBGaWxlcw0KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQorI2luY2x1ZGUgImVwb25PbnVMbnhLc01JLmgiDQogIA0KIC8qIERlZmluaXRpb25zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gDQpAQCAtMzMwLDYgKzMzMSwyMCBAQAogICBNVl9VMzIgc2hhZG93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIH1TX09udUVwb25EYmFTaGFkb3dSZWdNYXA7DQogDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX05PVEhJTkcgPSAwLA0KKyAgICBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYICAgICAgPSAxLA0KKyAgICBFX0VQT05fU0xFRVBfTU9ERV9DVFJMX1RYX1JYICAgPSAyLCANCit9IEVfRXBvblNsZWVwQ3RybE1vZGU7DQorDQordHlwZWRlZiBlbnVtDQorew0KKyAgICBFX0VQT05fTk9UX1BPV0VSX1NBVklOR19TVEFUVVMgICAgPSAwLCANCisgICAgRV9FUE9OX1BPV0VSX1NBVklOR19TTEVFUF9TVEFUVVMgID0gMSwgDQorICAgIEVfRVBPTl9QT1dFUl9TQVZJTkdfV0FLRVVQX1NUQVRVUyA9IDIsIA0KK30gRV9FcG9uUG93ZXJTYXZpbmdTdGF0dXM7DQorDQogdHlwZWRlZiBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgIE1WX1UzMiAgICAgICAgICAgb251RXBvblZhbGlkW0VQT05fTUFYX01BQ19OVU1dOyAgICAgIC8qIE9OVSBWYWxpZCBmb3Igc3luYyAqLyAgDQpAQCAtMzU4LDcgKzM3MywxNiBAQAogICBNVl9VMzIgICAgICAgICAgIG9udUVwb25PdmVySGVhZDsgICAgICAgICAgICAgDQogICBNVl9VMzIgICAgICAgICAgIG9udUVwb25QaHlPdXRwdXQ7ICAgICAgICAgICAgIA0KICAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uWHZyQnVyc3RFblBvbGFyaXR5Ow0KLX1TX09udUVwb25HZW5UYmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uT3B0aWNhbExvc1RpbWU7DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25NYWNMb3NUaW1lOw0KKyAgTVZfVTMyICAgICAgICAgICBvbnVFcG9uUG93ZXJTYXZpbmdXYWtldXA7DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25Qb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25TbGVlcEFjdGlvbjsNCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvblNsZWVwTW9kZTsNCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvblNsZWVwRHVyYXRpb247DQorICBNVl9VMzIgICAgICAgICAgIG9udUVwb25XYWtldXBEdXJhdGlvbjsNCisgIE1WX1UzMiAgICAgICAgICAgb251RXBvblBvd2VyU2F2aW5nU3RhdHVzOw0KK31TX09udUVwb25HZW5UYmw7DQogDQogLyogT05VIEVQT04gRGF0YSBQYXRoIHRhYmxlcyAqLw0KIHR5cGVkZWYgc3RydWN0DQpAQCAtNDY0LDYgKzQ4OCwyNCBAQAogTVZfVTMyICAgIG9udUVwb25EYk9udUhvbGRvdmVyVGltZUdldCh2b2lkKTsNCiBNVl9TVEFUVVMgb251RXBvbkRiT251SG9sZG92ZXJFeGVjU2V0KE1WX1UzMiBzdGF0ZSk7DQogTVZfVTMyICAgIG9udUVwb25EYk9udUhvbGRvdmVyRXhlY0dldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVTZXQoTVZfVTE2IGxvc1RpbWUpOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZUdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251TWFjTG9zVGltZVNldChNVl9VMTYgbG9zVGltZSk7DQorTVZfVTMyICAgIG9udUVwb25EYk9udU1hY0xvc1RpbWVHZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwU2V0KE1WX1U4IHdha2VVcEVuYWJsZSk7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nV2FrZXVwR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25TZXQoTVZfVTY0IG1heFNsZWVwRHVyYXRpb24pOw0KK01WX1UzMiAgICBvbnVFcG9uRGJPbnVQb3dlclNhdmluZ01heFNsZWVwRHVyYXRpb25HZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udVNsZWVwQWN0aW9uU2V0KE1WX1U4IGFjdGlvbik7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVNsZWVwQWN0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcE1vZGVTZXQoTVZfVTggbW9kZSk7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVNsZWVwTW9kZUdldCh2b2lkKTsNCitNVl9TVEFUVVMgb251RXBvbkRiT251U2xlZXBEdXJhdGlvblNldChNVl9VMzIgc2xlZXBEdXJhdGlvbik7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQodm9pZCk7DQorTVZfU1RBVFVTIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uU2V0KE1WX1UzMiB3YWtldXBEdXJhdGlvbik7DQorTVZfVTMyICAgIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KHZvaWQpOw0KK01WX1NUQVRVUyBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChNVl9VMzIgc3RhdHVzKTsNCitNVl9VMzIgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQodm9pZCk7DQogTVZfU1RBVFVTIG9udUVwb25EYk9udVNpbGVuY2VTdGF0ZVNldChNVl9VMzIgc3RhdGUpOw0KIE1WX1UzMiAgICBvbnVFcG9uRGJPbnVTaWxlbmNlU3RhdGVHZXQodm9pZCk7DQogTVZfU1RBVFVTIG9udUVwb25EYk9udVN3UnBydFRpbWVyVHlwZVNldChNVl9VMzIgdGltZXJUeXBlKTsNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUlzci5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9lcG9uL2Vwb25PbnVJc3IuYwppbmRleCA2NTRlNTZmLi5mYWZjZTJhIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2Vwb24vZXBvbk9udUlzci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZXBvbi9lcG9uT251SXNyLmMKQEAgLTEwOTUsODQgKzEwOTUsODcgQEAKIAkJcmV0dXJuKE1WX0VSUk9SKTsKIAkgIH0KIAl9Ci0JLyogS1cyIEFTSUMgUmV2IFoyICovCi0JLyogPT09PT09PT09PT09PT09ICovCi0JZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKQotCXsKLQkgIC8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyovCi0JICBQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOwotCSAgaWYgKGdwaW9NYXNrICE9IFBPTl9HUElPX05PVF9VU0VEKQotCSAgewotCSAgCXN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKm91dHB1dCovKTsKLQkgIAlpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgCXsKLQkgIAkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkgIAkJCSAgICJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgCSAgcmV0dXJuKE1WX0VSUk9SKTsKLQkgIAl9CisgICBlbHNlCisgICB7CisJICAgLyogS1cyIEFTSUMgUmV2IFoyICovCisJICAgLyogPT09PT09PT09PT09PT09ICovCisJICAgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikKKwkgICB7CisJCS8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyovCisJCVBPTl9HUElPX0dFVChCT0FSRF9HUFBfUE9OX1hWUl9UWCwgZ3Bpb0dyb3VwLCBncGlvTWFzayk7CisJCWlmIChncGlvTWFzayAhPSBQT05fR1BJT19OT1RfVVNFRCkKKwkJeworCQkgICAgIHN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB+Z3Bpb01hc2svKm91dHB1dCovKTsKKwkJICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorCQkgICAgIHsKKwkJICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOworCQkgICAgIH0KIAotCSAgCXN0YXR1cyA9IG12R3BwVmFsdWVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2sgLyplbmFibGUqLyk7Ci0JICAJaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIAl7Ci0JICAJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCQkgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQotCSAgfQorCQkgICAgIHN0YXR1cyA9IG12R3BwVmFsdWVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgZ3Bpb01hc2sgLyplbmFibGUqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJICAgICB9CisJCX0KIAotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfSU5QVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0JfQorCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9JTlBVVCwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSByZXR1cm4oTVZfRVJST1IpOworCQl9CisJICAgfQogCi0JLyogS1cyIEFTSUMgUmV2IEEwICovCi0JLyogPT09PT09PT09PT09PT09ICovCi0JZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKQotCXsKLSAgICAgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7Ci0JICBpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgewotCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCSAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0KLQkgIC8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZW5hYmxlICovCi0JICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMSwgMCk7Ci0JICBpZiAoc3RhdHVzICE9IE1WX09LKQotCSAgewotCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJICAgLyogS1cyIEFTSUMgUmV2IEEwICovCisJICAgLyogPT09PT09PT09PT09PT09ICovCisJICAgZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKQorCSAgIHsKKwkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9CRU5fSU9fRU4sIE9OVV9QSFlfT1VUUFVULCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKIAkJCSAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybihNVl9FUlJPUik7Ci0JICB9CisJCSAgcmV0dXJuKE1WX0VSUk9SKTsKKwkJfQogCi0gICAgICBwb2xhcml0eSA9IG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eUdldCgpOworCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMSwgMCk7CisJCWlmIChzdGF0dXMgIT0gTVZfT0spCisJCXsKKwkJICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkgICAgICByZXR1cm4oTVZfRVJST1IpOworCQl9CiAKLQkgIC8qIFhWUiBwb2xhcml0eSAqLwotCSAgLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLwotCSAgLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHRyYW5zbWl0IDAgdG8gdGhlIGxpbmUgICovCisJCXBvbGFyaXR5ID0gb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5R2V0KCk7CiAKLQkgIC8qIFAyUCBtb2RlICovCi0JICAvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLwotCSAgLyogRm9yY2UgVmFsdWUgPT0gMSwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KKwkJLyogWFZSIHBvbGFyaXR5ICovCisJCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KKwkJLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHRyYW5zbWl0IDAgdG8gdGhlIGxpbmUgICovCiAKLQkgIC8qIFNldHRpbmcgUDJQIHNob3VsZCBiZSByZXZlcnNlZCBmcm9tIFhWUiBwb2xhcml0eSAqLwotCSAgLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB3cml0ZSAxIGZvciBGb3JjZSBWYWx1ZSAqLwotCSAgLyogWFZSIHBvbGFyaXR5ID09IDEsIEFjdGl2ZSBMb3csIHdyaXRlIDAgZm9yIEZvcmNlIFZhbHVlICovCisJCS8qIFAyUCBtb2RlICovCisJCS8qIEZvcmNlIFZhbHVlID09IDAsIHRyYW5zbWl0IDAgdG8gdGhlIGxpbmUgICovCisJCS8qIEZvcmNlIFZhbHVlID09IDEsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCiAKLQkgIC8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZW5hYmxlIHZhbHVlIC0gYWNjb3JkaW5nIHRvIHBvbGFyaXR5ICovCi0JICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19WQUwsIHBvbGFyaXR5LCAwKTsKLQkgIGlmIChzdGF0dXMgIT0gTVZfT0spCi0JICB7Ci0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCSAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JCXJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0JfQorCQkvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KKwkJLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB3cml0ZSAxIGZvciBGb3JjZSBWYWx1ZSAqLworCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgd3JpdGUgMCBmb3IgRm9yY2UgVmFsdWUgKi8KKworCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19WQUwsIHBvbGFyaXR5LCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgIHJldHVybihNVl9FUlJPUik7CisJCX0KKwkgICB9CisgICB9CiAKIAkvKiBSZWFkIGN1cnJlbnQgRkVDIGNvbmZpZ3VyYXRpb24gKi8KICAgICBzdGF0dXMgPSBtdk9udUVwb25NYWNSeHBFbmNDb25maWdHZXQoJmlzclAycFByZXZpb3VzRmVjU3RhdGUpOwpAQCAtMTMxOCw2OSArMTMyMSw3MyBAQAogCQkgcmV0dXJuKE1WX0VSUk9SKTsKIAkgICB9CiAgICB9Ci0JLyogS1cyIEFTSUMgUmV2IFoyICovCi0JLyogPT09PT09PT09PT09PT09ICovCi0JZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKQotCXsKLQkgIFBPTl9HUElPX0dFVChCT0FSRF9HUFBfUE9OX1hWUl9UWCwgZ3Bpb0dyb3VwLCBncGlvTWFzayk7Ci0JICBpZiAoZ3Bpb01hc2sgIT0gUE9OX0dQSU9fTk9UX1VTRUQpCi0JICB7Ci0JICAJc3RhdHVzID0gbXZHcHBUeXBlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qb3V0cHV0Ki8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIAkgIHJldHVybihNVl9FUlJPUik7Ci0JICAJfQorICAgZWxzZQorICAgeworCSAgIC8qIEtXMiBBU0lDIFJldiBaMiAqLworCSAgIC8qID09PT09PT09PT09PT09PSAqLworCSAgIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfWjIpCisJICAgeworCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOworCQlpZiAoZ3Bpb01hc2sgIT0gUE9OX0dQSU9fTk9UX1VTRUQpCisJCXsKKwkJICAgICBzdGF0dXMgPSBtdkdwcFR5cGVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypvdXRwdXQqLyk7CisJCSAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJICAgICB7CisJCSAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgIkVSUk9SOiAoJXM6JWQpIG12R3BwVHlwZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOworCQkgICAgIH0KIAotCSAgCXN0YXR1cyA9IG12R3BwVmFsdWVTZXQoZ3Bpb0dyb3VwLCBncGlvTWFzaywgfmdwaW9NYXNrLypkaXNhYmxlKi8pOwotCSAgCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JICAJewotCSAgCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkJICAgICAiRVJST1I6ICglczolZCkgbXZHcHBWYWx1ZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAJICByZXR1cm4oTVZfRVJST1IpOwotCSAgCX0KKwkJICAgICBzdGF0dXMgPSBtdkdwcFZhbHVlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIH5ncGlvTWFzay8qZGlzYWJsZSovKTsKKwkJICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorCQkgICAgIHsKKwkJICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAiRVJST1I6ICglczolZCkgbXZHcHBWYWx1ZVNldFxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOworCQkgICAgIH0KIAotCSAgCXN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCBncGlvTWFzay8qaW5wdXQqLyk7Ci0JICAJaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIAl7Ci0JICAJICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCQkgICAgICJFUlJPUjogKCVzOiVkKSBtdkdwcFR5cGVTZXRcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwotCSAgCSAgcmV0dXJuKE1WX0VSUk9SKTsKLQkgIAl9Ci0JICB9CisJCSAgICAgc3RhdHVzID0gbXZHcHBUeXBlU2V0KGdwaW9Hcm91cCwgZ3Bpb01hc2ssIGdwaW9NYXNrLyppbnB1dCovKTsKKwkJICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorCQkgICAgIHsKKwkJICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKKwkJCQkJICAiRVJST1I6ICglczolZCkgbXZHcHBUeXBlU2V0XG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICAgICAgIHJldHVybihNVl9FUlJPUik7CisJCSAgICAgfQorCQl9CiAKLQkgIC8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gb3V0cHV0IHN0YXR1cyBzZXQgKi8KLQkgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7Ci0JICBpZiAoc3RhdHVzICE9IE1WX09LKQotICAgICAgewotCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JICAJCSAgICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JICAgIHJldHVybihNVl9FUlJPUik7Ci0JICB9Ci0JfQotCS8qIEtXMiBBU0lDIFJldiBBMCAqLwotCS8qID09PT09PT09PT09PT09PSAqLwotCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkKLQl7Ci0JICAvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIG91dHB1dCBzdGF0dXMgc2V0ICovCi0JICBzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCSAgCQkgICAgICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgICAgcmV0dXJuKE1WX0VSUk9SKTsKLQkgIH0KKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBvdXRwdXQgc3RhdHVzIHNldCAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCQkgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAgIkVSUk9SOiAoJXM6JWQpIGFzaWNPbnRNaXNjUmVnV3JpdGVcblxyIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCQkJIHJldHVybihNVl9FUlJPUik7CisJCX0KKwkgICB9CiAKLQkgIC8qIFBIWSBjb250cm9sIHJlZ2lzdGVyIC0gZm9yY2UgZGlzYWJsZSAqLwotCSAgc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fRU4sIDAsIDApOwotCSAgaWYgKHN0YXR1cyAhPSBNVl9PSykKLQkgIHsKLQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJICAgICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkJcmV0dXJuKE1WX0VSUk9SKTsKLQkgIH0KLQl9CisJICAgLyogS1cyIEFTSUMgUmV2IEEwICovCisJICAgLyogPT09PT09PT09PT09PT09ICovCisJICAgZWxzZSBpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKQorCSAgIHsKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBvdXRwdXQgc3RhdHVzIHNldCAqLworCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOworCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQl7CisJCSAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCSAgICAgICJFUlJPUjogKCVzOiVkKSBhc2ljT250TWlzY1JlZ1dyaXRlXG5cciIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJICByZXR1cm4oTVZfRVJST1IpOworCQl9CisKKwkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBkaXNhYmxlICovCisJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAwLCAwKTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJICAgICAiRVJST1I6ICglczolZCkgYXNpY09udE1pc2NSZWdXcml0ZVxuXHIiLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisJCSAgICAgIHJldHVybihNVl9FUlJPUik7CisJCX0KKwkgICB9CisgICB9CiAKIAkJaWYgKG9udUVwb25EYlAyUEZvcmNlTW9kZUdldCgpKQogCQl7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmMKaW5kZXggMjJjMzRkOC4uNTQ0MmZhYyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuYwpAQCAtMTYyLDEwICsxNjIsMTAgQEAKICoqCiAqKiAgT1VUUFVUUzogICAgIE1WX1UzMiAqZW50cnkKICoqCi0qKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIE1WX0VSUk9SCisqKiAgUkVUVVJOUzogICAgIE1WX1RSVUUgb3IgTVZfRkFMU0UKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKmVudHJ5LCBNVl9VMzIgKnRjb250KQorTVZfQk9PTCBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICplbnRyeSwgTVZfVTMyICp0Y29udCkKIHsKIAlNVl9VMzIgIGlFbnRyeTsKIAlNVl9VMzIgIG1hY0FsbG9jSWQ7CkBAIC0xNzgsNTAgKzE3OCwxNSBAQAogCQlpZiAoKHN0YXR1cyA9PSBNVl9PSykgJiYgKG1hY0FsbG9jSWQgPT0gYWxsb2NJZCkgJiYgKHZhbGlkID09IE1WX1RSVUUpKSB7CiAJCQkqZW50cnkgPSBpRW50cnk7CiAJCQkqdGNvbnQgPSB0Y29udE51bTsKLQkJCXJldHVybiAoTVZfT0spOworCQkJcmV0dXJuIChNVl9UUlVFKTsKIAkJfQogCX0KIAotCXJldHVybiAoTVZfRVJST1IpOworCXJldHVybiAoTVZfRkFMU0UpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKLSoqICBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jQ2hlY2sKLSoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCi0qKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIEJXIE1hcCBlbnRyeSBpcyB2YWxpZCBhbmQgcmV0dXJuIFQtQ29udAotKiogICAgICAgICAgICAgICBhbmQgQWxsb2MgTnVtYmVyCi0qKgotKiogIFBBUkFNRVRFUlM6ICBub25lCi0qKgotKiogIE9VVFBVVFM6ICAgICBNVl9VMzIgKmFsbG9jSWQKLSoqICAgICAgCSBNVl9VMzIgKnRjb250Ci0qKgotKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBNVl9FUlJPUgotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNBbGxvY0NoZWNrKE1WX1UzMiBpbmRleCwgTVZfVTMyICphbGxvY0lkLCBNVl9VMzIgKnRjb250KQotewotCU1WX1UzMiAgbWFjQWxsb2NJZDsKLQlNVl9VMzIgIHRjb250TnVtOwotCU1WX0JPT0wgdmFsaWQ7Ci0JTVZfU1RBVFVTIHN0YXR1czsKLQotICAgICAgIHN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBHZXQoaW5kZXgsICZtYWNBbGxvY0lkLCAmdmFsaWQsICZ0Y29udE51bSk7Ci0gICAgICAgaWYgKChzdGF0dXMgPT0gTVZfT0spICYmICh2YWxpZCA9PSBNVl9UUlVFKSkKLSAgICAgICB7Ci0JICAgICAgICphbGxvY0lkID0gbWFjQWxsb2NJZDsKLQkgICAgICAgKnRjb250ICAgPSB0Y29udE51bTsKLQkgICAgICAgcmV0dXJuIChNVl9PSyk7Ci0gICAgICAgfQotCi0gICAgICAgcmV0dXJuIChNVl9FUlJPUik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCiAqKiAgb251R3BvbkFsbG9jSWRNYWNBbGxvY0ZyZWVFbnRyeUdldAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC0yMzEsMTAgKzE5NiwxMCBAQAogKioKICoqICBPVVRQVVRTOiAgICAgTVZfVTMyICplbnRyeQogKioKLSoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgTVZfRVJST1IKKyoqICBSRVRVUk5TOiAgICAgTVZfVFJVRSBvciBNVl9GQUxTRQogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNBbGxvY0ZyZWVFbnRyeUdldChNVl9VMzIgKmVudHJ5KQorTVZfQk9PTCBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRnJlZUVudHJ5R2V0KE1WX1UzMiAqZW50cnkpCiB7CiAJTVZfVTMyICBpRW50cnk7CiAJTVZfVTMyICBtYWNBbGxvY0lkOwpAQCAtMjQ2LDExICsyMTEsMTEgQEAKIAkJc3RhdHVzID0gbXZPbnVHcG9uTWFjUnhCd01hcEdldChpRW50cnksICZtYWNBbGxvY0lkLCAmdmFsaWQsICZ0Y29udE51bSk7CiAJCWlmICgoc3RhdHVzID09IE1WX09LKSAmJiAodmFsaWQgPT0gTVZfRkFMU0UpKSB7CiAJCQkqZW50cnkgPSBpRW50cnk7Ci0JCQlyZXR1cm4gKE1WX09LKTsKKwkJCXJldHVybiAoTVZfVFJVRSk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gKE1WX0VSUk9SKTsKKwlyZXR1cm4gKE1WX0ZBTFNFKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3Miw5ICsyMzcsMTAgQEAKIHsKIAlNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CiAJTVZfVTMyICAgIGVudHJ5OworCU1WX0JPT0wgICBleGlzdDsKIAotCXN0YXR1cyA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NGcmVlRW50cnlHZXQoJmVudHJ5KTsKLQlpZiAoc3RhdHVzICE9IE1WX09LKQorCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0ZyZWVFbnRyeUdldCgmZW50cnkpOworCWlmIChleGlzdCA9PSBNVl9GQUxTRSkKIAkJcmV0dXJuIChNVl9FUlJPUik7CiAKIAlzdGF0dXMgPSBtdk9udUdwb25NYWNSeEJ3TWFwU2V0KGVudHJ5LCBhbGxvY0lkLCB0Y29udElkLCBNVl9UUlVFKTsKQEAgLTMwNyw2ICsyNzMsNyBAQAogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkTWFjQ29ubmVjdChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyIHRjb250TnVtKQogewogCU1WX1NUQVRVUyBzdGF0dXM7CisJTVZfQk9PTCAgIGV4aXN0OwogCU1WX1UzMiAgICBlbnRyeTsKIAlNVl9VMzIgICAgdGNvbnQ7CiAJTVZfVTMyICAgIG5ld0lkbGVUY29udEVudHJ5OwpAQCAtMzIxLDggKzI4OCw4IEBACiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJLyogdmFsaWRhdGUgdGhhdCByZXF1ZXN0ZWQgYWxsb2MtSWQgaXMgY29uZmlndXJlZCBpbiBIVyBhbmQgaXMgdmFsaWQgKi8KLQlzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhhbGxvY0lkLCAmZW50cnksICZ0Y29udCk7Ci0JaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCWV4aXN0ID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOworCWlmIChleGlzdCAhPSBNVl9UUlVFKSB7CiAJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAogCQkJCQkiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNDb25uZWN0LCBhbGxvYyBJZCglZCkgZW50cnkoJWQpXG4iLAogCQkJCQlfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgYWxsb2NJZCwgZW50cnkpOwpAQCAtMzM0LDggKzMwMSw4IEBACiAJCSoqIHNob3VsZCBiZSBjaGFuZ2VkIHRvIGFub3RoZXIgSWRsZSBULUNvbnQgKi8KIAogCQkvKiBDaGVjayBmb3IgYSBmcmVlIChpZGxlKSBlbnRyeSBpbiB0aGUgVGNvbnQgREIgdGFibGUgKi8KLQkJc3RhdHVzID0gb251R3BvbkRiQndUY29udEZyZWVHZXQoYWxsb2NJZCwgJmZyZWVUY29udEVudHJ5KTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgeworCQlleGlzdCA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZmcmVlVGNvbnRFbnRyeSk7CisJCWlmIChleGlzdCAhPSBNVl9UUlVFKSB7CiAjaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVAogCQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCiAJCQkJCQkiREVCVUc6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNDb25uZWN0LCBhbGxvYyBJZCglZCkgZnJlZVRjb250RW50cnkoJWQpXG4iLApAQCAtMzUxLDggKzMxOCw4IEBACiAJCQkJb251R3BvbkRiQndJZGxlQWxsb2NHZXQobmV3SWRsZVRjb250RW50cnksICZlbnRyeUFsbG9jSWQpOwogCQkJCWlmIChlbnRyeUFsbG9jSWQgIT0gUE9OX09OVV9BTExPQ19OT1RfRVhJU1QpIHsKIAkJCQkJLyogQ2hlY2sgaWYgdGhpcyBpZGxlIEFsbG9jIElEIGV4aXN0cyBpbiB0aGUgSFcgdGFibGUgKi8KLQkJCQkJc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soZW50cnlBbGxvY0lkLCAmYndNYXBFbnRyeSwgJnRjb250KTsKLQkJCQkJaWYgKHN0YXR1cyA9PSBNVl9PSykgeworCQkJCQlleGlzdCA9IG9udUdwb25BbGxvY0lkTWFjQWxsb2NFeGlzdENoZWNrKGVudHJ5QWxsb2NJZCwgJmJ3TWFwRW50cnksICZ0Y29udCk7CisJCQkJCWlmIChleGlzdCA9PSBNVl9UUlVFKSB7CiAJCQkJCQkvKiByZS1hc3NpZ24gdGhpcyBBbGxvYyBJRCB0byB0aGUgbmV3IGlkbGUgVGNvbnQgaW4gSFcgKi8KIAkJCQkJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBTZXQoYndNYXBFbnRyeSwgZW50cnlBbGxvY0lkLCBvbnVJZGxlQWxsb2NUY29udCwgTVZfVFJVRSk7CiAJCQkJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CkBAIC0zNzgsMTEgKzM0NSwxOSBAQAogCiAjaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVAogCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotCQkgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBhY3RpdmUsIENvbm5lY3RcbiIsCi0JCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udE51bSk7CisgICAgICAgICAgICAgICJERUJVRzogKCVzOiVkKSBBbGxvY0lkTWFjQ29ubmVjdCwgdHBtX2FjdGl2ZV90Y29udCwgVGNvbnQoJWQpXG4iLAorICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOwogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAotCW9udUdwb25XcVRjb250QWN0aXZhdGUodGNvbnROdW0pOworCXByaW50aygiVENPTlQgKCVkKSBhY3RpdmUsIENvbm5lY3RcbiIsIHRjb250TnVtKTsKKwlzdGF0dXMgPSBvbnVHcG9uV3FUY29udEFjdGl2YXRlKHRjb250TnVtKTsKKwlpZiAoc3RhdHVzICE9IE1WX09LKQorCXsKKwkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BTExPQ19NT0RVTEUsCisJCQkgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNBZGQsIGZhaWxlZCB0byBzY2hlZHVsZSBULUNvbnQoJWQpIGFjdGl2YXRlIGluIFdRXG4iLAorCQkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250TnVtKTsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KIAogCXJldHVybiAoc3RhdHVzKTsKIH0KQEAgLTQwNCw2ICszNzksNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY1JlY29ubmVjdChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyIHRjb250TnVtKQogeworCU1WX0JPT0wgICBleGlzdDsKIAlNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CiAJTVZfVTMyICAgIGVudHJ5OwogCU1WX1UzMiAgICBvbnVJZDsKQEAgLTQxNywxMiArMzkzLDEyIEBACiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJLyogR2V0IGZyZWUgZW50cnkgKi8KLQlzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhhbGxvY0lkLCAmZW50cnksICZ0Y29udCk7Ci0JaWYgKHN0YXR1cyA9PSBNVl9PSykKLQkJcmV0dXJuKHN0YXR1cyk7CisJZXhpc3QgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhhbGxvY0lkLCAmZW50cnksICZ0Y29udCk7CisJaWYgKGV4aXN0ICE9IE1WX1RSVUUpCisJCXJldHVybiAoTVZfRVJST1IpOwogCi0Jc3RhdHVzID0gb251R3BvbkRiQndUY29udEZyZWVHZXQoYWxsb2NJZCwgJnRjb250RnJlZU51bSk7Ci0JaWYgKHN0YXR1cyAhPSBNVl9PSykKKwlleGlzdCA9IG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KGFsbG9jSWQsICZ0Y29udEZyZWVOdW0pOworCWlmIChleGlzdCAhPSBNVl9UUlVFKQogCQlvbnVJZGxlQWxsb2NUY29udCA9IHRjb250RnJlZU51bTsKIAogCS8qIENoZWNrIGlmIGRlZmF1bHQgQWxsb2MgSWQgKi8KQEAgLTQzNSw2ICs0MTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOwogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAorCSAgICAgICAvLyBwcmludGsoIlRDT05UICglZCkgZmx1c2gsIFJlY29ubmVjdFxuIiwgdGNvbnROdW0pOworCSAgICAgICAvLyBzdGF0dXMgPSBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKwkgICAgICAgLy8gaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkgICAgICAgLy97CisJICAgICAgIC8vIAltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FMTE9DX01PRFVMRSwKKwkgICAgICAgLy8gCQkgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRNYWNSZWNvbm5lY3QsIGZhaWxlZCB0byBzY2hlZHVsZSBULUNvbnQoJWQpIGZsdXNoIGluIFdRXG4iLAorCSAgICAgICAvLyAJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udE51bSk7CisJICAgICAgIC8vfQorCiAJCS8qIFNldCBBbGxvYyBJZCB0byBULUNvbnQgaW4gdGhlIEdNQUMgaGFyZHdhcmUgKi8KIAkJc3RhdHVzID0gbXZPbnVHcG9uTWFjUnhCd01hcFNldChlbnRyeSwgYWxsb2NJZCwgb251SWRsZUFsbG9jVGNvbnQsIE1WX1RSVUUpOwogCX0KQEAgLTQ0Miw1MSArNDI3LDYgQEAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqCi0qKiAgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlCi0qKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHJlYWN0aXZhdGUgb251IHRjb250IGluY2FzZSB0aGUgdGNvbnQgaXMgbm90Ci0qKiAgICAgICAgICAgICAgIGNsZWFyIGFuZCBzZXQgYnkgbW5nCi0qKgotKiogIFBBUkFNRVRFUlM6ICBOb25lCi0qKgotKiogIE9VVFBVVFM6ICAgICBOb25lCi0qKgotKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBlcnJvcgotKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvbkFsbG9jSWRNYWNSZUFjdGl2YXRlKHZvaWQpCi17Ci0JTVZfU1RBVFVTIHN0YXR1czsKLQlNVl9VMzIgICAgZW50cnk7Ci0JTVZfVTMyCSAgYWxsb2NJZDsKLQlNVl9VMzIgICAgdGNvbnQ7Ci0KLSNpZmRlZiBNVl9HUE9OX0RFQlVHX1BSSU5UCi0JbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0gICAgICAgICAgICAgICJERUJVRzogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZE1hY1JlQWN0aXZhdGVcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCi0KLQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBPTlVfR1BPTl9NQVhfTlVNX09GX1RfQ09OVFM7IGVudHJ5KyspCi0JewotCQlzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jQ2hlY2soZW50cnksICZhbGxvY0lkLCAmdGNvbnQpOwotCQlpZiAoc3RhdHVzID09IE1WX09LKQotCQl7Ci0JCQltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkJCQkgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBhY3RpdmUsIENvbm5lY3RcbiIsCi0JCQkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsKLQotCQkJb251R3BvbldxVGNvbnRBY3RpdmF0ZSh0Y29udCk7Ci0JCX0KLQl9Ci0KLQotCXJldHVybiAoTVZfT0spOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKICoqICBvbnVHcG9uQWxsb2NJZE1hY0Rpc2Nvbm5lY3QKQEAgLTUwNiw2ICs0NDYsNyBAQAogCU1WX1UzMiAgb251SWQ7CiAJTVZfVTMyICBlbnRyeTsKIAlNVl9VMzIgIHRjb250OworCU1WX0JPT0wgZXhpc3Q7CiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCiAjaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVApAQCAtNTE1LDIxICs0NTYsMjggQEAKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKIAkvKiBDaGVjayBpZiBhbHJlYWR5IGV4aXN0ICovCi0Jc3RhdHVzID0gb251R3BvbkFsbG9jSWRNYWNBbGxvY0V4aXN0Q2hlY2soYWxsb2NJZCwgJmVudHJ5LCAmdGNvbnQpOwotCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JCXJldHVybihNVl9FUlJPUik7CisJZXhpc3QgPSBvbnVHcG9uQWxsb2NJZE1hY0FsbG9jRXhpc3RDaGVjayhhbGxvY0lkLCAmZW50cnksICZ0Y29udCk7CisJaWYgKGV4aXN0ID09IE1WX0ZBTFNFKQorCQlyZXR1cm4gKE1WX0VSUk9SKTsKIAogCS8qIENoZWNrIGlmIGRlZmF1bHQgQWxsb2MgSWQgKi8KIAlvbnVJZCA9IG9udUdwb25EYk9udUlkR2V0KCk7CiAJaWYgKGFsbG9jSWQgIT0gb251SWQpCiAJewogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKLQkJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsCi0JCQkgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBmbHVzaCwgRGlzY29ubmVjdFxuIiwKLQkJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7CisJICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICAgICAiREVCVUc6ICglczolZCkgdHBtX2RlYWN0aXZlX3Rjb250LCBUY29udCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsKICNlbmRpZiAvKiBNVl9HUE9OX0RFQlVHX1BSSU5UICovCiAKLQkJb251R3BvbldxVGNvbnRGbHVzaCh0Y29udCk7CisJCXByaW50aygiVENPTlQgKCVkKSBmbHVzaCwgRGlzY29ubmVjdFxuIiwgdGNvbnQpOworCQlzdGF0dXMgPSBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250KTsKKwkJaWYgKHN0YXR1cyAhPSBNVl9PSykKKwkJeworCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BTExPQ19NT0RVTEUsCisJCQkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkTWFjRGlzY29ubmVjdCwgZmFpbGVkIHRvIHNjaGVkdWxlIFQtQ29udCglZCkgZmx1c2ggaW4gV1FcbiIsCisJCQkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIHRjb250KTsKKwkJfQogCiAJCXN0YXR1cyA9IG12T251R3Bvbk1hY1J4QndNYXBTZXQoZW50cnksIDAsIDAsIE1WX0ZBTFNFKTsKIAkJaWYgKHN0YXR1cyAhPSBNVl9PSykKQEAgLTYxMiw3ICs1NjAsNyBAQAogCS8qIGNoZWNrIGlmIEFsbG9jLUlkIGV4aXN0IGluIHRoZSBhbGxvYyBJZCBEQiB0YWJsZSAqLwogCWFsbG9jSWRFeGlzdCA9IG9udUdwb25EYkJ3QWxsb2NFeGlzdChhbGxvY0lkKTsKIAlpZiAoYWxsb2NJZEV4aXN0ID09IE1WX1RSVUUpCi0JCXJldHVybiAoTVZfTk9fQ0hBTkdFLypNVl9PSyovKTsKKwkJcmV0dXJuIChNVl9PSyk7CiAKIAkvKiBzZXQgdGhlIEFsbG9jLUlkIGV4aXN0IHRvIHRoZSBkYXRhYmFzZSAqLwogCXN0YXR1cyA9IG9udUdwb25EYkJ3QWxsb2NJbnNlcnQoYWxsb2NJZCwgJmVudHJ5KTsKQEAgLTc2NiwxNSArNzE0LDIxIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkRnJlZUFsbEJ1ZmZlcnModm9pZCkKIHsKLSAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisgICAgTVZfU1RBVFVTIHN0YXR1czsKICAgICBNVl9VMzIgICAgdGNvbnROdW0gPSAweEZGOwotCiAjaWZkZWYgTVZfR1BPTl9ERUJVR19QUklOVAogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLAotCSAgICAgICAiREVCVUc6ICglczolZCkgRnJlZUFsbEJ1ZmZlcnNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICJERUJVRzogKCVzOiVkKSByZWxlYXNlIEFsbCBULUNvbnRzIGJ1ZmZlcnMsIHRwbV9kZWFjdGl2ZV90Y29udFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwogI2VuZGlmIC8qIE1WX0dQT05fREVCVUdfUFJJTlQgKi8KIAotICAgIG9udUdwb25XcVRjb250Rmx1c2godGNvbnROdW0pOworICAgIHByaW50aygiVENPTlQgZmx1c2gsIEZyZWVBbGxCdWZmZXJzXG4iKTsKKyAgICBzdGF0dXMgPSBvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKyAgICBpZiAoc3RhdHVzICE9IE1WX09LKQorICAgIHsKKyAgICAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQUxMT0NfTU9EVUxFLAorICAgICAgICAJICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZEZyZWVBbGxCdWZmZXJzLCBmYWlsZWQgdG8gc2NoZWR1bGUgQWxsIFQtQ29udCBmbHVzaCBpbiBXUVxuIiwKKyAgICAgICAgCSAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnROdW0pOworICAgIH0KIAogICAgIHJldHVybihzdGF0dXMpOwogfQpAQCAtMTAwNywxNCArOTYxLDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG9udUdwb25BbGxvY0lkVGNvbnRDbGVhckFsbCh2b2lkKQogewotCU1WX1UzMiAgICBpRW50cnk7Ci0JTVZfQk9PTCAgIGV4aXN0OwotCU1WX1NUQVRVUyBzdGF0dXMgPSBNVl9PSzsKKwlNVl9VMzIgIGlFbnRyeTsKKwlNVl9CT09MIGV4aXN0OworCU1WX1NUQVRVUyBzdGF0dXM7CiAJTVZfVTMyICAgIHRjb250TnVtID0gMHhGRjsKIAogI2lmZGVmIE1WX0dQT05fREVCVUdfUFJJTlQKIAltdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwKLQkJICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UIGZsdXNoLCBDbGVhciBBbGxcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKwkJCQkiREVCVUc6ICglczolZCkgQ2xlYXIgQWxsIEFsbG9jLUlkcyBmcm9tIFQtVENPTlRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJZm9yIChpRW50cnkgPSAwIDsgaUVudHJ5IDwgT05VX0dQT05fTUFYX05VTV9PRl9UX0NPTlRTIDsgaUVudHJ5KyspIHsKQEAgLTEwMjQsNyArOTc4LDE1IEBACiAJCQlvbnVHcG9uQWxsb2NJZFRjb250Q2xlYXIoaUVudHJ5KTsKIAl9CiAKLQlvbnVHcG9uV3FUY29udEZsdXNoKHRjb250TnVtKTsKKwlwcmludGsoIlRDT05UIGZsdXNoLCBDbGVhciBBbGxcbiIpOworCXN0YXR1cyA9IG9udUdwb25XcVRjb250Rmx1c2godGNvbnROdW0pOworCWlmIChzdGF0dXMgIT0gTVZfT0spCisJeworCSAJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BTExPQ19NT0RVTEUsCisJIAkJICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkVGNvbnRDbGVhckFsbCwgZmFpbGVkIHRvIHNjaGVkdWxlIEFsbCBULUNvbnQgZmx1c2ggaW4gV1FcbiIsCisJIAkJICAgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworCX0KKwogCiAJcmV0dXJuIChNVl9PSyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUFsbG9jLmgKaW5kZXggNWNhMmRiNS4uMTRkMmY1YyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVBbGxvYy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251QWxsb2MuaApAQCAtMTA1LDcgKzEwNSw2IEBACiBNVl9TVEFUVVMgb251R3BvbkFsbG9jSWREZUFzc2lnbkFsbCh2b2lkKTsNCiBNVl9TVEFUVVMgb251R3BvbkFsbG9jSWRGcmVlQWxsQnVmZmVycyh2b2lkKTsNCiBNVl9TVEFUVVMgb251R3BvbkFsbG9jSWRUY29udENsZWFyQWxsKHZvaWQpOw0KLU1WX1NUQVRVUyBvbnVHcG9uQWxsb2NJZE1hY1JlQWN0aXZhdGUodm9pZCk7DQogTVZfVTMyICAgIG9udUdwb25JZGxlQWxsb2NJZFRjb250R2V0KHZvaWQpOw0KIA0KIC8qIE1hY3Jvcw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuYwppbmRleCA1MmM2ZGRjLi4zOTFiYzM1IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5jCkBAIC0zMjU0LDEwICszMjU0LDEwIEBACiAqKgogKiogIE9VVFBVVFM6ICAgICBOb25lCiAqKgotKiogIFJFVFVSTlM6ICAgICBNVl9PSyBpZiB0aGVyZSBpcyBhIGZyZWUgZW50cnksIE1WX0VSUk9SIG90aGVyd2lzZQorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIGlmIHRoZXJlIGlzIGEgZnJlZSBlbnRyeSwgTVZfRkFMU0Ugb3RoZXJ3aXNlCiAqKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBvbnVHcG9uRGJCd1Rjb250RnJlZUdldChNVl9VMzIgYWxsb2NJZCwgTVZfVTMyICp0Y29udE51bSkKK01WX0JPT0wgb251R3BvbkRiQndUY29udEZyZWVHZXQoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqdGNvbnROdW0pCiB7CiAJTVZfQk9PTCBleGlzdDsKIAlNVl9VMzIgIGRiQWxsb2NJZDsKQEAgLTMyNzAsNyArMzI3MCw3IEBACiAJCW9udUdwb25EYkJ3VGNvbnRHZXQoaVRjb250LCAmZXhpc3QsICZkYkFsbG9jSWQsICZkYlZhbGlkKTsKIAkJaWYgKChleGlzdCA9PSBNVl9UUlVFKSAmJiAoZGJWYWxpZCA9PSBNVl9GQUxTRSkpIHsKIAkJCSp0Y29udE51bSA9IGlUY29udDsKLQkJCXJldHVybihNVl9PSyk7CisJCQlyZXR1cm4oTVZfVFJVRSk7CiAJCX0KIAogCQlpZiAoZGJBbGxvY0lkID09IGFsbG9jSWQpCkBAIC0zMjc5LDcgKzMyNzksNyBAQAogCiAJKnRjb250TnVtID0gdGVtcFRjb250OwogCi0JcmV0dXJuKE1WX0VSUk9SKTsKKwlyZXR1cm4oTVZfRkFMU0UpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVEYi5oCmluZGV4IDU5ZGViNzIuLjUzNWI2ZWEgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251RGIuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udURiLmgKQEAgLTM5Miw3ICszOTIsNyBAQAogTVZfU1RBVFVTIG9udUdwb25EYkJ3VGNvbnRDbGVhcihNVl9VMzIgdGNvbnROdW0pOwogTVZfU1RBVFVTIG9udUdwb25EYkJ3VGNvbnRBbGxvYyhNVl9VMzIgdGNvbnROdW0sIE1WX1UzMiBhbGxvY0lkKTsKIE1WX1NUQVRVUyBvbnVHcG9uRGJCd1Rjb250Q29ubmVjdENoZWNrKE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKnRjb250TnVtLCBNVl9CT09MICp2YWxpZCk7Ci1NVl9TVEFUVVMgb251R3BvbkRiQndUY29udEZyZWVHZXQoTVZfVTMyIGFsbG9jSWQsIE1WX1UzMiAqdGNvbnROdW0pOworTVZfQk9PTCAgIG9udUdwb25EYkJ3VGNvbnRGcmVlR2V0KE1WX1UzMiBhbGxvY0lkLCBNVl9VMzIgKnRjb250TnVtKTsKIAogTVZfU1RBVFVTIG9udUdwb25EYkJ3TWFwQ250RHVtcFNldChNVl9VMzIgZW5hYmxlKTsKIE1WX0JPT0wgICBvbnVHcG9uRGJCd01hcENudER1bXBHZXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUlzci5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVJc3IuaAppbmRleCA0OWY1YzkyLi4xMWVlOTZiIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udUlzci5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251SXNyLmgKQEAgLTExMyw3ICsxMTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAjZGVmaW5lIE9OX0dQT05fTUFYX0FMQVJNUyAgICAgICAgICAgICAgICAgICAgICAoMykNCiANCi0jZGVmaW5lIE9OVV9HUE9OX0lOVF9BTEFSTVMgICAgICAgICAgICAgICAgICAgICAoT05VX0dQT05fTE9GX0FMQVJNX01BU0spDQorI2RlZmluZSBPTlVfR1BPTl9JTlRfQUxBUk1TICAgICAgICAgICAgICAgICAgICAgKE9OVV9HUE9OX0xPRl9BTEFSTV9NQVNLIHxcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OVV9HUE9OX0xDREdfQUxBUk1fTUFTSykNCiANCiAjZGVmaW5lIE9OVV9HUE9OX1BBUklUWV9FUlJPUiAgICAgICAgICAgICAgICAgICAoT05VX0dQT05fUkFNX1RFU1RfR1JYX1BBUklUWV9FUlJfTUFTSyAgfFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05VX0dQT05fUkFNX1RFU1RfR0VNX1BBUklUWV9FUlJfTUFTSyAgfFwNCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3IuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nci5jCmluZGV4IGVjMTk1N2MuLjEzOWU5NjQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nci5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL2NvcmUvZ3Bvbi9ncG9uT251TW5nci5jCkBAIC0zNjQsNyArMzY0LDcgQEAKICAgTVZfVTMyICAgICAgICAgIG9udVN0YXRlOw0KICAgR1BPTkZVTkNQVFIgICAgIHB0ckZ1bmM7DQogICBTX09udUdwb25HZW5UYmwgKm9udUdwb25HZW5UYmxfcCA9ICYob251R3BvbkRiX3Mub251R3BvbkdlblRibF9zKTsNCi0gIE1WX1UzMiAgICAgICAgICAqbXNnRGF0YV9wID0gKE1WX1UzMiopbXNnRGF0YTsNCisgIE1WX1UzMiAgICAgICAgICAqbXNnRGF0YV9wID0gbXNnRGF0YTsNCiANCiAgIC8qIGdldCBvbnUgSWQgKi8NCiAgIGFwcE9udUlkID0gb251R3BvbkRiT251SWRHZXQoKTsNCkBAIC0zODgsMTEgKzM4OCwxMSBAQAogICAgICAgfQ0KICAgICAgIGVsc2UNCiAgICAgICB7DQotCW9udUdwb25TeW5jTG9nKE9OVV9HUE9OX0xPR19NU0csIG9udUlkLCBtc2dJZCwgMCk7DQotCW9udUdwb25TeW5jTG9nKE9OVV9HUE9OX0xPR19NU0dfQ09OVEVOVCwgKihtc2dEYXRhX3ApLCAqKG1zZ0RhdGFfcCArIDEpLCAqKG1zZ0RhdGFfcCArIDIpKTsNCiAgICAgICAgICgqcHRyRnVuYykob251SWQsIG1zZ0lkLCBtc2dEYXRhKTsNCiAgICAgICB9ICAgICAgICAgICANCiANCisgICAgICBvbnVHcG9uU3luY0xvZyhPTlVfR1BPTl9MT0dfTVNHLCBvbnVJZCwgbXNnSWQsIDApOw0KKyAgICAgIG9udUdwb25TeW5jTG9nKE9OVV9HUE9OX0xPR19NU0dfQ09OVEVOVCwgKihtc2dEYXRhX3ApLCAqKG1zZ0RhdGFfcCArIDEpLCAqKG1zZ0RhdGFfcCArIDIpKTsNCiAgICAgfQ0KICAgICAvKiBoYW5kbGUgaW52YWxpZCBtZXNzYWdlcyAqLw0KICAgICBlbHNlDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVNbmdyU3RhdGVNYWNoaW5lLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3JTdGF0ZU1hY2hpbmUuYwppbmRleCAyNjg2ODI2Li5mNjQ1YjM0IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3JTdGF0ZU1hY2hpbmUuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udU1uZ3JTdGF0ZU1hY2hpbmUuYwpAQCAtODQsMTIgKzg0LDYgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIF9fRklMRV9ERVNDX18gIm12X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVN0YXRlTWFjaGluZS5jIgogCi0jZGVmaW5lIElORElDQVRJT05fQklUX01BUF9OT05FICAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgSU5ESUNBVElPTl9CSVRfTUFQX0ZJQkVSX0VWRU5UICAgICAgICAgICgweDAwMDAwMDAxKQotI2RlZmluZSBJTkRJQ0FUSU9OX0JJVF9NQVBfRk9SQ0VfVENPTlRfQ0xFQVIgICAgKDB4MDAwMDAwMDIpCi0jZGVmaW5lIElORElDQVRJT05fQklUX01BUF9GT1JDRV9UQ09OVF9SRUNPTkZJRyAoMHgwMDAwMDAwNCkKLSNkZWZpbmUgSU5ESUNBVElPTl9CSVRfTUFQX1JFU0VSVkVEICAgICAgICAgICAgICgweDAwMDAwMDA4KQotCiAvKiBHbG9iYWwgVmFyaWFibGVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZXh0ZXJuIHNwaW5sb2NrX3Qgb251UG9uSXJxTG9jazsKQEAgLTEwNyw5ICsxMDEsOSBAQAogLyogTG9jYWwgRnVuY3Rpb25zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogTVZfU1RBVFVTIG9udUdwb25Qb25NbmdyVXBkYXRlU3RhdGUoTVZfVTMyIG5ld1N0YXRlKTsKLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKTsKLU1WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHMoTVZfVTMyIGluZGljYXRpb25CaXRNYXApOwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnMoTVZfVTMyIGluZGljYXRpb25CaXRNYXApOworTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUluZm8odm9pZCk7CitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycyh2b2lkKTsKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHModm9pZCk7CiBNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251UG9ydHModm9pZCk7CiBNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251SWQodm9pZCk7CiBNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251RGVsYXkodm9pZCk7CkBAIC0yNTMsOSArMjQ3LDkgQEAKICoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnMoTVZfVTMyIGluZGljYXRpb25CaXRNYXApCitNVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycyh2b2lkKQogewotICAgTVZfU1RBVFVTIHJjb2RlID0gTVZfT0s7CisgICBNVl9TVEFUVVMgcmNvZGU7CiAKICAgIHJjb2RlID0gb251R3BvbkFsbG9jSWRGcmVlQWxsQnVmZmVycygpOwogICAgaWYgKHJjb2RlICE9IE1WX09LKQpAQCAtMjY0LDE5ICsyNTgsNiBAQAogICAgCSAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKICAgIH0KIAotCi0gICBpZiAoKG9udUdwb25EYlRjb250UmVzZXRHZXQoKSAhPSBNVl9UUlVFKSAmJgotICAgICAgIChpbmRpY2F0aW9uQml0TWFwICYgSU5ESUNBVElPTl9CSVRfTUFQX0ZJQkVSX0VWRU5UKSkKLSAgIHsKLQkgcmNvZGUgPSBvbnVHcG9uQWxsb2NJZE1hY1JlQWN0aXZhdGUoKTsKLQkgaWYgKHJjb2RlICE9IE1WX09LKQotCSB7Ci0JICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0JCSAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgICByZXR1cm4ocmNvZGUpOwotCSB9Ci0gICB9Ci0KICAgIHJldHVybihNVl9PSyk7CiB9CiAKQEAgLTI5NSw3ICsyNzYsNyBAQAogKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBlcnJvcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhNVl9VMzIgaW5kaWNhdGlvbkJpdE1hcCkKK01WX1NUQVRVUyBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKHZvaWQpCiB7CiAgIE1WX1NUQVRVUyByY29kZTsKIApAQCAtMzAzLDMyICsyODQsMjkgQEAKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0gICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251UG9ydHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4ocmNvZGUpOworICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udVBvcnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7ICAgIHJldHVybihyY29kZSk7CiAgIH0KIAotICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cyhpbmRpY2F0aW9uQml0TWFwKTsKKyAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHMoKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0gICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0gICAgcmV0dXJuKHJjb2RlKTsKKyAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsgICAgcmV0dXJuKHJjb2RlKTsKICAgfQogCi0gIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251QnVmZmVycyhpbmRpY2F0aW9uQml0TWFwKTsKKyAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVCdWZmZXJzKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAogICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udUJ1ZmZlcnNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4ocmNvZGUpOworICAgIHJldHVybjsKICAgfQogCiAgIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SWQoKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCi0gICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvblBvbk1uZ0NsZWFyT251SWRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSAgICByZXR1cm4ocmNvZGUpOworICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25Qb25NbmdDbGVhck9udUlkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7ICAgIHJldHVybihyY29kZSk7CiAgIH0KIAogICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udURlbGF5KCk7CkBAIC00MDksMjAgKzM4NywxOCBAQAogKiogIFJFVFVSTlM6ICAgICBNVl9PSyBvciBlcnJvcgogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl9TVEFUVVMgb251R3BvblBvbk1uZ0NsZWFyT251VGNvbnRzKE1WX1UzMiBpbmRpY2F0aW9uQml0TWFwKQorTVZfU1RBVFVTIG9udUdwb25Qb25NbmdDbGVhck9udVRjb250cyh2b2lkKQogewogICBNVl9TVEFUVVMgcmNvZGUgPSBNVl9PSzsKIAotICBpZiAoKG9udUdwb25EYlRjb250UmVzZXRHZXQoKSA9PSBNVl9UUlVFKSB8fAotICAgICAgKGluZGljYXRpb25CaXRNYXAgJiBJTkRJQ0FUSU9OX0JJVF9NQVBfRk9SQ0VfVENPTlRfQ0xFQVIpKQotICB7Ci0JcmNvZGUgPSBvbnVHcG9uQWxsb2NJZERlQXNzaWduQWxsKCk7Ci0JaWYgKHJjb2RlICE9IE1WX09LKQotCXsKLQkgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotCQkgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVUY29udHNcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLQkgIHJldHVybihyY29kZSk7Ci0JfQorICBpZiAob251R3BvbkRiVGNvbnRSZXNldEdldCgpPT1NVl9UUlVFKSB7CisgICAgICByY29kZSA9IG9udUdwb25BbGxvY0lkRGVBc3NpZ25BbGwoKTsKKyAgICAgIGlmIChyY29kZSAhPSBNVl9PSykKKyAgICAgIHsKKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCisgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkRGVBc3NpZ25BbGxcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuKHJjb2RlKTsKKyAgICAgIH0KICAgfQogCiAgIHJldHVybihNVl9PSyk7CkBAIC0xMDEyLDIxICs5ODgsMTQgQEAKIAogICAgIC8qIHNldCBEZWZhdWx0IGFsbG9jSWQgYWNjb3JkaW5nIHRvIHRoZSBvbnVJZCAqLwogICAgIHJjb2RlID0gb251R3BvbkFsbG9jSWRBc3NpZ24obXNnT251SWQsIDApOwotICAgIGlmICgocmNvZGUgIT0gTVZfT0spICYmIChyY29kZSAhPSBNVl9OT19DSEFOR0UpKQorICAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgICB7Ci0JICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAotCQkgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkQXNzaWduXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7Ci0JCSAgICAgICByZXR1cm47CisgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIG9udUdwb25BbGxvY0lkQXNzaWduXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICByZXR1cm47CiAgICAgfQotICAgIGVsc2UgaWYgKChyY29kZSAhPSBNVl9PSykgJiYgKHJjb2RlID09IE1WX05PX0NIQU5HRSkpCi0gICAgewotCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKLQkJICAgICAgICJFUlJPUjogKCVzOiVkKSBvbnVHcG9uQWxsb2NJZEFzc2lnbiwgQWxsb2MgSWQgZXhpc3RcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsKLSAgICB9Ci0gICAgZWxzZSAvKiBNVl9PSyAqLwotICAgIHsKLQkgICAgb251R3BvbkFsbG9jSWRNYWNBZGQobXNnT251SWQsIFBPTl9PTlVfREVGQVVMVF9BTExPQ19UQ09OVCk7Ci0gICAgfQorCisgICAgb251R3BvbkFsbG9jSWRNYWNBZGQobXNnT251SWQsIFBPTl9PTlVfREVGQVVMVF9BTExPQ19UQ09OVCk7CiAKICAgICAvKiBTZXQgZGVsYXkgcmVjZWl2ZWQgZnJvbSBPTFQgKi8KICAgICBlcXVhbGl6YXRpb25EZWxheVRlbXAgPSBvbnVHcG9uRGJFcXVhbGl6YXRpb25EZWxheUdldCgpOwpAQCAtMTI5NCwxMiArMTI2MywxMiBAQAogCQkgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIGN1cnJGaW5hbERlbGF5KTsKIAogICAgICAgLyogQ2hlY2sgaWYgY2FuIGNoYW5nZSB0aGUgVFggRmluYWwgRGVsYXkgb25seSAqLwotICAgICAgaWYgKGNoYW5nZURlbGF5ICsgY3VyckZpbmFsRGVsYXkgPD0gR1BPTl9UWF9GSU5BTF9ERUxBWV9NQVgpCisgICAgICBpZiAoY2hhbmdlRGVsYXkgKyBjdXJyRmluYWxEZWxheSA+IEdQT05fVFhfRklOQUxfREVMQVlfTUFYKQogICAgICAgewogICAgICAgICBmaW5hbERlbGF5ID0gY3VyckZpbmFsRGVsYXkgKyBjaGFuZ2VEZWxheTsKIAogCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fU01fU1RBVEVfTU9EVUxFLAotCQkgICAiUmFuZ2UgRGVidWcgSW5mbzogKCVzOiVkKSwgU3RhdGUgTzUsIENoYW5nZSBkZWxheSArIGN1cnJlbnQgRmluYWwgZGVsYXkgPD0gTUFYIEZpbmFsIGRlbGF5KDB4M0YpLCB1cGRhdGVkIGZpbmFsIGRlbGF5LCBmaW5hbERlbGF5ID0gY3VyckZpbmFsRGVsYXkgKyBjaGFuZ2VEZWxheSwgKDB4JXgpXG4iLAorCQkgICAiUmFuZ2UgRGVidWcgSW5mbzogKCVzOiVkKSwgU3RhdGUgTzUsIENoYW5nZSBkZWxheSArIGN1cnJlbnQgRmluYWwgZGVsYXkgPiBNQVggRmluYWwgZGVsYXkoMHgzRiksIHVwZGF0ZWQgZmluYWwgZGVsYXksIGZpbmFsRGVsYXkgPSBjdXJyRmluYWxEZWxheSArIGNoYW5nZURlbGF5LCAoMHgleClcbiIsCiAJCSAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCBmaW5hbERlbGF5KTsKICAgICAgIH0KICAgICAgIGVsc2UKQEAgLTEzMTAsNyArMTI3OSw3IEBACiAjZW5kaWYgLyogTVZfR1BPTl9ERUJVR19QUklOVCAqLwogCiAJbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9TTV9TVEFURV9NT0RVTEUsCi0JCSAgICJSYW5nZSBEZWJ1ZyBJbmZvOiAoJXM6JWQpLCBTdGF0ZSBPNSwgQ2hhbmdlIGRlbGF5ICsgRmluYWwgZGVsYXkgPiBNQVggRmluYWwgZGVsYXkgPSAweDNGLCB1cGRhdGVkIGVxdWFsaXphdGlvbiBkZWxheVxuIiwKKwkJICAgIlJhbmdlIERlYnVnIEluZm86ICglczolZCksIFN0YXRlIE81LCBDaGFuZ2UgZGVsYXkgKyBGaW5hbCBkZWxheSA8IE1BWCBGaW5hbCBkZWxheSA9IDB4M0YsIHVwZGF0ZWQgZXF1YWxpemF0aW9uIGRlbGF5XG4iLAogCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CiAKICAgICAgICAgLyogY2FsYyBkZWxheSAqLwpAQCAtMTQwMyw3ICsxMzcyLDcgQEAKIAogICAvKiBjbGVhciBvbnUgaW5mb3JtYXRpb24gKi8KICAgLyogPT09PT09PT09PT09PT09PT09PT09ICovCi0gIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhJTkRJQ0FUSU9OX0JJVF9NQVBfRk9SQ0VfVENPTlRfQ0xFQVIpOworICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCkBAIC0xNDk5LDcgKzE0NjgsNyBAQAogCiAJCS8qIGNsZWFyIG9udSBpbmZvcm1hdGlvbiAqLwogCQkvKiA9PT09PT09PT09PT09PT09PT09PT0gKi8KLQkJcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKElORElDQVRJT05fQklUX01BUF9GT1JDRV9UQ09OVF9DTEVBUik7CisJCXJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbygpOwogCQlpZiAocmNvZGUgIT0gTVZfT0spIHsKIAkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLAogCQkJCQkgICAiRVJST1I6ICglczolZCkgRElTQUJMRTogb251R3BvblBvbk1uZ0NsZWFyT251SW5mb1xuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOwpAQCAtMTg3MSw3ICsxODQwLDcgQEAKICAgICBpZiAobmV3QWxsb2NTdGF0dXMgPT0gTVZfVFJVRSkKICAgICB7CiAgICAgICBzdGF0dXMgPSBvbnVHcG9uQWxsb2NJZEFzc2lnbihhbGxvY0lkLCAxKTsKLSAgICAgIGlmICgoc3RhdHVzICE9IE1WX09LKSAmJiAoc3RhdHVzICE9IE1WX05PX0NIQU5HRSkpCisgICAgICBpZiAoc3RhdHVzICE9IE1WX09LKQogICAgICAgewogICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX1NNX01PRFVMRSwKICAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgb251R3BvbkFsbG9jSWRBc3NpZ24gb251SWQoJWQpLCBhbGxvY0lkKCVkKVxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18sIG9udUlkLCBhbGxvY0lkKTsKQEAgLTI2NjIsNyArMjYzMSw3IEBACiAKICAgLyogY2xlYXIgb251IGluZm9ybWF0aW9uICovCiAgIC8qID09PT09PT09PT09PT09PT09PT09PSAqLwotICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oSU5ESUNBVElPTl9CSVRfTUFQX0ZJQkVSX0VWRU5UKTsKKyAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKCk7CiAgIGlmIChyY29kZSAhPSBNVl9PSykKICAgewogICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLApAQCAtMjczNSw3ICsyNzA0LDcgQEAKIAogICAvKiBjbGVhciBvbnUgaW5mb3JtYXRpb24gKi8KICAgLyogPT09PT09PT09PT09PT09PT09PT09ICovCi0gIHJjb2RlID0gb251R3BvblBvbk1uZ0NsZWFyT251SW5mbyhJTkRJQ0FUSU9OX0JJVF9NQVBfRklCRVJfRVZFTlQpOworICByY29kZSA9IG9udUdwb25Qb25NbmdDbGVhck9udUluZm8oKTsKICAgaWYgKHJjb2RlICE9IE1WX09LKQogICB7CiAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9TTV9NT0RVTEUsCkBAIC0yOTE5LDcgKzI4ODgsNyBAQAogCiAgICAgLyogY2xlYXIgb251IGluZm9ybWF0aW9uICovCiAgICAgLyogPT09PT09PT09PT09PT09PT09PT09ICovCi0gICAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKElORElDQVRJT05fQklUX01BUF9GSUJFUl9FVkVOVCk7CisgICAgcmNvZGUgPSBvbnVHcG9uUG9uTW5nQ2xlYXJPbnVJbmZvKCk7CiAgICAgaWYgKHJjb2RlICE9IE1WX09LKQogICAgIHsKICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fU01fTU9EVUxFLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuYwppbmRleCA1YjNjNDU0Li4wNDRmNTg5IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuYwpAQCAtMTIyMSw3ICsxMjIxLDcgQEAKICAgICAgICAgICAgIGJyZWFrOw0KIA0KICAgICAgICAgY2FzZSBPTlVfR1BPTl9MT0dfTVNHX0NPTlRFTlQ6DQotICAgICAgICAgICAgcHJpbnRrKCJbJTAzZF0gUExPQU0gbWVzc2FnZSwgZGF0YT0weCUwOHglMDh4JTA4eCBbMDMwMjAxMDAwNzA2MDUwNDExMTAwOTA4XVxuIiwgcHJpbnRFbnRyeSwNCisgICAgICAgICAgICBwcmludGsoIlslMDNkXSBQTE9BTSBtZXNzYWdlLCBkYXRhPTB4JTA4eCUwOHglMDh4XG4iLCBwcmludEVudHJ5LA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwxLA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwyLA0KICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLmRhdGFWYWwzKTsNCkBAIC0xMjMyLDcgKzEyMzIsNiBAQAogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uc3RhdGUsDQogICAgICAgICAgICAgICAgICAgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0udGltZSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5kYXRhVmFsMSk7DQotICAgICAgICAgICAgcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsNCiAgICAgICAgICAgICBicmVhazsNCiANCiAgICAgICAgIGNhc2UgT05VX0dQT05fTE9HX0lOVEVSUlVQVF9YVlJfU0Q6DQpAQCAtMTI1Niw3ICsxMjU1LDcgQEAKICAgICAgICAgICAgIGJyZWFrOw0KIA0KICAgICAgICAgY2FzZSBPTlVfR1BPTl9MT0dfSU5URVJSVVBUX1NFUkRFU19TVE9QOg0KLSAgICAgICAgICAgIHByaW50aygiWyUwM2RdIFNFUkRFUyBTdG9wLCBzdGF0ZT0lZCwgdGltZT0lMDh4XG4iLCBwcmludEVudHJ5LA0KKyAgICAgICAgICAgIHByaW50aygiWyUwM2RdIEludGVycnVwdCwgc3RhdGU9JWQsIHRpbWU9JTA4eFxuIiwgcHJpbnRFbnRyeSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS5zdGF0ZSwNCiAgICAgICAgICAgICAgICAgICAgIG9udUdwb25Mb2dEYltwcmludEVudHJ5XS50aW1lKTsNCiAgICAgICAgICAgICBicmVhazsNCkBAIC0xMjY3LDE0ICsxMjY2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnRpbWUpOw0KICAgICAgICAgICAgIGJyZWFrOw0KIA0KLSAgICAgICAgY2FzZSBPTlVfR1BPTl9MT0dfRlJFRV9URVhUOg0KLSAgICAgICAgICAgIHByaW50aygiWyUwM2RdIEZyZWUsIHRpbWU9JTA4eCAlZCAlZCAlZFxuIiwgcHJpbnRFbnRyeSwNCi0gICAgICAgICAgICAgICAgICAgb251R3BvbkxvZ0RiW3ByaW50RW50cnldLnRpbWUsDQotCQkgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDEsDQotCQkgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDIsDQotCQkgICBvbnVHcG9uTG9nRGJbcHJpbnRFbnRyeV0uZGF0YVZhbDMpOw0KLSAgICAgICAgICAgIGJyZWFrOw0KLQ0KICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICBwcmludGsoIlslMDNkXSBPdGhlclxyXG4iLCBwcmludEVudHJ5KTsNCiAgICAgICAgICAgICBicmVhazsNCkBAIC0xMzEwLDEwICsxMzAxLDE1IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KIE1WX1NUQVRVUyBvbnVHcG9uV3FUY29udEZsdXNoKE1WX1UzMiB0Y29udCkNCiB7DQorICAgIE1WX1NUQVRVUyByY29kZTsNCisNCiAgICAgaWYgKHRjb250ICE9IDB4RkYpDQotCXF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRDbGVhbldvcmtbdGNvbnRdKTsNCisJcmNvZGUgPSBxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250Q2xlYW5Xb3JrW3Rjb250XSk7DQogICAgIGVsc2UNCi0gICAgICAgIHF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRDbGVhbkFsbFdvcmspOw0KKyAgICAgICAgcmNvZGUgPSBxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250Q2xlYW5BbGxXb3JrKTsNCisNCisgICAgaWYocmNvZGUgPT0gMCkNCisJcmV0dXJuKE1WX0VSUk9SKTsNCiANCiAgICAgcmV0dXJuKE1WX09LKTsNCiB9DQpAQCAtMTMzNSw3ICsxMzMxLDExIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KIE1WX1NUQVRVUyBvbnVHcG9uV3FUY29udEFjdGl2YXRlKE1WX1UzMiB0Y29udCkNCiB7DQotICAgIHF1ZXVlX3dvcmsoZ3BvblRjb250Rmx1c2hXcS5wb25XcSwgKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSZncG9uVGNvbnRBY3RpdmVXb3JrW3Rjb250XSk7DQorICAgIE1WX1NUQVRVUyByY29kZTsNCisNCisgICAgcmNvZGUgPSBxdWV1ZV93b3JrKGdwb25UY29udEZsdXNoV3EucG9uV3EsIChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKikmZ3BvblRjb250QWN0aXZlV29ya1t0Y29udF0pOw0KKyAgICBpZihyY29kZSA9PSAwKQ0KKyAgICAgICAgcmV0dXJuKE1WX0VSUk9SKTsNCiANCiAgICAgcmV0dXJuKE1WX09LKTsNCiB9DQpAQCAtMTM3MSwxNyArMTM3MSwxNCBAQAogICAgIHsNCiAJaWYgKG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID09IFRDT05UX0ZMVVNIX1JVTk5JTkdfU1RBVEUpDQogCXsNCi0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkJCSAgICJERUJVRzogKCVzOiVkKSBUQ09OVCAoJWQpIENMRUFOX0VWRU5UXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQpOw0KLQkJb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9CTE9DS0lOR19TVEFURTsNCi0JCXRwbV9kZWFjdGl2ZV90Y29udCh0Y29udCk7DQotCQlvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JFQURZX1NUQVRFOw0KKwkgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX0JMT0NLSU5HX1NUQVRFOw0KKwkgICB0cG1fZGVhY3RpdmVfdGNvbnQodGNvbnQpOw0KKwkgICBwcmludGsoIlRDT05UICglZCkgQ0xFQU5fRVZFTlRcbiIsIHRjb250KTsNCisJICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SRUFEWV9TVEFURTsNCiAJfQ0KIAllbHNlDQogCXsNCi0JCW12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkJCSAgICJERUJVRzogKCVzOiVkKSBSZWNlaXZlZCBUQ09OVF9DTEVBTl9FVkVOVCB3aGlsZSBpbiBULUNPTlQoJWQpIHN0YXRlKCVzKVxuIiwNCi0JCQkgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQsIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KKwkgICBwcmludGsoIlJlY2VpdmVkIFRDT05UX0NMRUFOX0VWRU5UIHdoaWxlIGluIFQtQ09OVCglZCkgc3RhdGUoJXMpXG4iLCB0Y29udCwgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQogCX0NCiAgICAgfQ0KIA0KQEAgLTEzOTMsMTcgKzEzOTAsMTQgQEAKIAl7DQogCSAgICBpZiAob251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPT0gVENPTlRfRkxVU0hfUlVOTklOR19TVEFURSkNCiAJICAgIHsNCi0JCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JCQkgICAgICAgIkRFQlVHOiAoJXM6JWQpIFRDT05UICglZCkgQ0xFQU5fRVZFTlRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7DQotCQkgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9CTE9DS0lOR19TVEFURTsNCi0JCSAgICB0cG1fZGVhY3RpdmVfdGNvbnQodGNvbnQpOw0KLQkJICAgIG9udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdID0gVENPTlRfRkxVU0hfUkVBRFlfU1RBVEU7DQorCSAgICAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX0JMT0NLSU5HX1NUQVRFOw0KKwkgICAgICAgdHBtX2RlYWN0aXZlX3Rjb250KHRjb250KTsNCisJICAgICAgIHByaW50aygiVENPTlQgKCVkKSBDTEVBTl9FVkVOVFxuIiwgdGNvbnQpOw0KKwkgICAgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SRUFEWV9TVEFURTsNCiAJICAgIH0NCiAJICAgIGVsc2UNCiAJICAgIHsNCi0JCSAgICBtdlBvblByaW50KFBPTl9QUklOVF9ERUJVRywgUE9OX0FMTE9DX01PRFVMRSwNCi0JCQkgICAgICAgIkRFQlVHOiAoJXM6JWQpIFJlY2VpdmVkIFRDT05UX0NMRUFOX0VWRU5UIHdoaWxlIGluIFQtQ09OVCglZCkgc3RhdGUoJXMpXG4iLA0KLQkJCSAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgdGNvbnQsIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KKwkgICAgICAgcHJpbnRrKCJSZWNlaXZlZCBUQ09OVF9DTEVBTl9FVkVOVCB3aGlsZSBpbiBULUNPTlQoJWQpIHN0YXRlKCVzKVxuIiwgdGNvbnQsIHN0YXRlVGV4dFtvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XV0pOw0KIAkgICAgfQ0KIAl9DQogICAgIH0NCkBAIC0xNDE0LDE2ICsxNDA4LDEzIEBACiAgICAgew0KICAgICAgICBpZiAob251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPT0gVENPTlRfRkxVU0hfUkVBRFlfU1RBVEUpDQogICAgICAgIHsNCi0JICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0RFQlVHLCBQT05fQUxMT0NfTU9EVUxFLA0KLQkgICAgICAgICAgICAiREVCVUc6ICglczolZCkgVENPTlQgKCVkKSBBQ1RJVkVfRVZFTlRcbiIsIF9fRklMRV9ERVNDX18sIF9fTElORV9fLCB0Y29udCk7DQotCSAgICAgICBvbnVHcG9uVGNvbnRGbHVzaFN0YXRlW3Rjb250XSA9IFRDT05UX0ZMVVNIX1JVTk5JTkdfU1RBVEU7DQotCSAgICAgICB0cG1fYWN0aXZlX3Rjb250KHRjb250KTsNCisgICAgICAgICAgb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF0gPSBUQ09OVF9GTFVTSF9SVU5OSU5HX1NUQVRFOw0KKyAgICAgICAgICB0cG1fYWN0aXZlX3Rjb250KHRjb250KTsNCisgICAgICAgICAgcHJpbnRrKCJUQ09OVCAoJWQpIEFDVElWRV9FVkVOVFxuIiwgdGNvbnQpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KLQkgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfREVCVUcsIFBPTl9BTExPQ19NT0RVTEUsDQotCQkJICAiREVCVUc6ICglczolZCkgUmVjZWl2ZWQgVENPTlRfQUNUSVZFX0VWRU5UIHdoaWxlIGluIFQtQ09OVCBzdGF0ZSglcylcbiIsDQotCQkJICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXywgc3RhdGVUZXh0W29udUdwb25UY29udEZsdXNoU3RhdGVbdGNvbnRdXSk7DQorICAgICAgICAgICBwcmludGsoIlJlY2VpdmVkIFRDT05UX0FDVElWRV9FVkVOVCB3aGlsZSBpbiBULUNPTlQgc3RhdGUoJXMpXG4iLCBzdGF0ZVRleHRbb251R3BvblRjb250Rmx1c2hTdGF0ZVt0Y29udF1dKTsNCiAgICAgICAgfQ0KICAgICB9DQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vY29yZS9ncG9uL2dwb25PbnVTcnZjLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuaAppbmRleCA1ZDg0YjEzLi5lZDA4YjJkIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9jb3JlL2dwb24vZ3Bvbk9udVNydmMuaApAQCAtODksNyArODksNiBAQAogI2RlZmluZSBPTlVfR1BPTl9MT0dfU1RBVEUJCQkoNikNCiAjZGVmaW5lIE9OVV9HUE9OX0xPR19NU0cJCQkoNykNCiAjZGVmaW5lIE9OVV9HUE9OX0xPR19NU0dfQ09OVEVOVAkJKDgpDQotI2RlZmluZSBPTlVfR1BPTl9MT0dfRlJFRV9URVhUCQkJKDkpDQogDQogI2RlZmluZSBPTlVfR1BPTl9MT0dfU0laRSAgICAgICAgICAgICAgICAgICAgICAgKDUxMikNCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzTUkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5jCmluZGV4IGNiNTI3ZTAuLmYxODVmZDQgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5jCkBAIC04OSw4ICs4OSw2IEBACiAKIC8qIExvY2FsIFZhcmlhYmxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyAgIFNfRXBvbklvY3RsVGRtUXVldWUgaW9jdGxUZG1RdWV1ZTsKLXN0YXRpYyAgIFNfRXBvbklvY3RsRGJhICAgICAgaW9jdGxEYmE7CiAKIC8qIEV4cG9ydCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00NzcsNyArNDc1LDkgQEAKICAgb251RXBvbkRiT251SG9sZG92ZXJTdGF0ZVNldChpb2N0bEhvbGRvdmVyLT5ob2xkb3ZlclN0YXRlKTsKICAgb251RXBvbkRiT251SG9sZG92ZXJUaW1lU2V0KGlvY3RsSG9sZG92ZXItPmhvbGRvdmVyVGltZSk7CiAKLSAgb251RXBvbklzclRpbWVySG9sZG92ZXJJbnRlcnZhbFNldChpb2N0bEhvbGRvdmVyLT5ob2xkb3ZlclRpbWUsIDApOworICAvKiBBZGQgdGhlIG5ld2x5IGNvbmZpZ3VyZWQgaG9sZG92ZXIgdGltZSB3aXRoIE9wdGljYWxMb3NUaW1lICovCisgIG9udUVwb25Jc3JUaW1lckhvbGRvdmVySW50ZXJ2YWxTZXQob251RXBvbkRiT251SG9sZG92ZXJUaW1lR2V0KCkgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnVFcG9uRGJPbnVPcHRpY2FsTG9zVGltZUdldCgpLCAwKTsKIAogICBtdlBvblByaW50KFBPTl9QUklOVF9JTkZPLCBQT05fQVBJX01PRFVMRSwKIAkJCSAiREVCVUc6IEhvbGRvdmVyIGNvbmZpZywgc3RhdGUoJWQpLCB0aW1lKCVkKSlcbiIsCkBAIC01MTIsNiArNTEyLDEzMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKKyoqICBvbnVFcG9uTWlMb3NUaW1lQ29uZmlnCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHRpbWUgZGVsYXkgZm9yIGVudGVyaW5nIGhvbGRvdmVyIHN0YXR1cworKioKKyoqICBQQVJBTUVURVJTOiAgKmlvY3RsTG9zVGltZSAtIHRpbWUgZGVsYXkgdmFsdWUKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE5vbmUKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG9udUVwb25NaUxvc1RpbWVDb25maWcoU19FcG9uSW9jdGxMb3NUaW1lICppb2N0bExvc1RpbWUpCit7CisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworCisgICAgTVZfVTE2IG9wdGljYWxMb3NUaW1lOworICAgIE1WX1UxNiBtYWNMb3NUaW1lOworCisgICAgb3B0aWNhbExvc1RpbWUgPSBpb2N0bExvc1RpbWUtPm9wdGljYWxfbG9zX3RpbWU7CisgICAgbWFjTG9zVGltZSAgICAgPSBpb2N0bExvc1RpbWUtPm1hY19sb3NfdGltZTsKKworICAgIHN0YXR1cyA9IG12RXBvbkFwaUxvc1RpbWVDb25maWcob3B0aWNhbExvc1RpbWUsIG1hY0xvc1RpbWUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvbk1pVHhQb3dlckNvbnRyb2xDb25maWcKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29udHJvbHMgdGhlIFRYIHBvd2VyIG9uIGFuZCBvZmYKKyoqCisqKiAgUEFSQU1FVEVSUzogIGlvY3RsVHhDb250cm9sIC0gb24sIG9mZiBhbmQgdGltZSBkZWxheSBiZWZvcmUgb2ZmCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBOb25lCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBvbnVFcG9uTWlUeFBvd2VyQ29udHJvbENvbmZpZyhTX0Vwb25Jb2N0bFR4Q29udHJvbCAqaW9jdGxUeENvbnRyb2wpCit7CisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworICAgIE1WX1UxNiBhY3Rpb247CisgICAgTVZfVTE2IHRpbWU7CisgICAgICAgIAorICAgIGFjdGlvbiA9IGlvY3RsVHhDb250cm9sLT5hY3Rpb247CisgICAgdGltZSAgID0gaW9jdGxUeENvbnRyb2wtPnRpbWUgKiAxMDAwOyAgIC8qIFRoZSB0aW1lIGZyb20gdXNlciBzcGFjZSBpcyBleHByZXNzZWQgaW4gc2Vjb25kICovCisKKyAgICBzdGF0dXMgPSBtdkVwb25BcGlUeFBvd2VyQ3RybENvbmZpZyhhY3Rpb24sIHRpbWUpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvbk1pUG93ZXJTYXZpbmdDb25maWcKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gc2V0cyBtYXhTbGVlcER1cmF0aW9uIGZvciBwb3dlciBzYXZpbmcgbW9kZQorKioKKyoqICBQQVJBTUVURVJTOiAgKmlvY3RsUG93ZXJTYXZpbmcgLSBwb3dlciBzYXZpbmcgbW9kZSBkdXJhdGlvbgorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTm9uZQorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgb251RXBvbk1pUG93ZXJTYXZpbmdDb25maWcoU19FcG9uSW9jdGxQb3dlclNhdmluZyAqaW9jdGxQb3dlclNhdmluZykKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzID0gTVZfT0s7CisKKyAgICBNVl9VOCAgZWFybHlXYWtldXA7CisgICAgTVZfVTY0IG1heFNsZWVwRHVyYXRpb247CisKKyAgICBlYXJseVdha2V1cCAgICAgID0gaW9jdGxQb3dlclNhdmluZy0+ZWFybHlXYWtlVXA7CisgICAgbWF4U2xlZXBEdXJhdGlvbiA9IGlvY3RsUG93ZXJTYXZpbmctPm1heFNsZWVwRHVyYXRpb247CisKKyAgICBzdGF0dXMgPSBtdkVwb25BcGlQb3dlclNhdmluZ0NvbmZpZyhlYXJseVdha2V1cCwgbWF4U2xlZXBEdXJhdGlvbik7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uTWlDb250cm9sU2xlZXBDb25maWcKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gdHJpZ2dlcnMgdGhlIGFjdGlvbiBvZiBwb3dlciBtb2RlIHRyYW5zZm9ybWF0aW9uCisqKgorKiogIFBBUkFNRVRFUlM6ICAqaW9jdGxDb250cm9sU2xlZXAgLSBwb3dlciBjb250cm9sIGFuZCBzbGVlcC93YWtldXAgZHVyYXRpb24KKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE5vbmUKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG9udUVwb25NaUNvbnRyb2xTbGVlcENvbmZpZyhTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcCAqaW9jdGxDb250cm9sU2xlZXApCit7CisgICAgTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOworCisgICAgdWludDhfdCBhY3Rpb247CisKKyAgICBhY3Rpb24gPSBpb2N0bENvbnRyb2xTbGVlcC0+YWN0aW9uOworCisgICAgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0RJU0FCTEUpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybEVuYWJsZSgpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9DT05GSUcpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxDZmcoaW9jdGxDb250cm9sU2xlZXAtPnNsZWVwTW9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb2N0bENvbnRyb2xTbGVlcC0+c2xlZXBEdXJhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb2N0bENvbnRyb2xTbGVlcC0+d2FpdER1cmF0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKICoqICBvbnVFcG9uTWlTaWxlbmNlQ29uZmlnCiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKQEAgLTY1MCwxMSArNzc2LDE3IEBACiAgIFNfRXBvbklvY3RsRmVjICAgICAgaW9jdGxGZWM7CiAgIFNfRXBvbklvY3RsRW5jICAgICAgaW9jdGxFbmM7CiAgIFNfRXBvbklvY3RsT2FtVHggICAgaW9jdGxUeE9hbTsKKyAgU19FcG9uSW9jdGxEYmEgICAgICBpb2N0bERiYTsKICAgU19FcG9uSW9jdGxIb2xkT3ZlciBpb2N0bEhvbGRvdmVyOwogICBTX0Vwb25Jb2N0bFNpbGVuY2UgIGlvY3RsU2lsZW5jZTsKKyAgU19FcG9uSW9jdGxUZG1RdWV1ZSBpb2N0bFRkbVF1ZXVlOwogICBNVl9VMzIgICAgICAgICAgICAgIGlvY3RsU3RhdGU7CiAgIE1WX1UzMiAgICAgICAgICAgICAgaW9jdGxBbGFybTsKICAgU19FcG9uSW9jdGxSb2d1ZU9udSBpb2N0bFJvZ3VlT251OworICBTX0Vwb25Jb2N0bExvc1RpbWUgICAgICBpb2N0bExvc1RpbWU7CisgIFNfRXBvbklvY3RsVHhDb250cm9sICAgIGlvY3RsVHhDb250cm9sOworICBTX0Vwb25Jb2N0bFBvd2VyU2F2aW5nICBpb2N0bFBvd2VyU2F2aW5nOworICBTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcCBpb2N0bENvbnRyb2xTbGVlcDsKICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKICAgaW50ICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwogCkBAIC04NzAsNiArMTAwMiw5MCBAQAogICAgICAgcmV0ID0gMDsKICAgICAgIGJyZWFrOwogCisgICAgLyogPT09PT09IE1WRVBPTl9JT0NUTF9MT1NfVElNRSA9PT09PT09PT09PT09PT09PT09PSAqLworICAgIGNhc2UgTVZFUE9OX0lPQ1RMX0xPU19USU1FOgorICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsTG9zVGltZSwgKFNfRXBvbklvY3RsTG9zVGltZSopYXJnLCBzaXplb2YoU19FcG9uSW9jdGxMb3NUaW1lKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwKKyAgICAgIAkJICAgICAgICAgICAiRVJST1I6ICglczolZCkgY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgc3RhdHVzID0gb251RXBvbk1pTG9zVGltZUNvbmZpZygmKGlvY3RsTG9zVGltZSkpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSAwOworICAgICAgICAKKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiA9PT09PT0gTVZFUE9OX0lPQ1RMX1RYX0NPTlRST0wgPT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICBjYXNlIE1WRVBPTl9JT0NUTF9UWF9DT05UUk9MOgorICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmlvY3RsVHhDb250cm9sLCAoU19FcG9uSW9jdGxUeENvbnRyb2wqKWFyZywgc2l6ZW9mKFNfRXBvbklvY3RsVHhDb250cm9sKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwKKyAgICAgIAkJICAgICAgICAgICAiRVJST1I6ICglczolZCkgY29weV9mcm9tX3VzZXIgZmFpbGVkXG4iLCBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBnb3RvIGlvY3RsRXJyOworICAgICAgICB9CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgc3RhdHVzID0gb251RXBvbk1pVHhQb3dlckNvbnRyb2xDb25maWcoJihpb2N0bFR4Q29udHJvbCkpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSAwOworICAgICAgICAKKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiA9PT09PT0gTVZFUE9OX0lPQ1RMX1BPV0VSX1NBVklORyA9PT09PT09PT09PT09PT09PT09PSAqLworICAgIGNhc2UgTVZFUE9OX0lPQ1RMX1BPV0VSX1NBVklORzoKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZpb2N0bFBvd2VyU2F2aW5nLCAoU19FcG9uSW9jdGxQb3dlclNhdmluZyopYXJnLCBzaXplb2YoU19FcG9uSW9jdGxQb3dlclNhdmluZykpKQorICAgICAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsCisgICAgICAJCSAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIHN0YXR1cyA9IG9udUVwb25NaVBvd2VyU2F2aW5nQ29uZmlnKCYoaW9jdGxQb3dlclNhdmluZykpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gaW9jdGxFcnI7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSAwOworCisgICAgICAgIGJyZWFrOworCisgICAgLyogPT09PT09IE1WRVBPTl9JT0NUTF9DT05UUk9MX1NMRUVQID09PT09PT09PT09PT09PT09PT09ICovCisgICAgY2FzZSBNVkVQT05fSU9DVExfQ09OVFJPTF9TTEVFUDoKKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZpb2N0bENvbnRyb2xTbGVlcCwgKFNfRXBvbklvY3RsQ29udHJvbFNsZWVwKilhcmcsIHNpemVvZihTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcCkpKQorICAgICAgICB7CisgICAgICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsCisgICAgICAJCSAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwgX19GSUxFX0RFU0NfXywgX19MSU5FX18pOworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgICAgIHN0YXR1cyA9IG9udUVwb25NaUNvbnRyb2xTbGVlcENvbmZpZygmKGlvY3RsQ29udHJvbFNsZWVwKSk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBNVl9PSykKKyAgICAgICAgeworICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIAorICAgICAgICBicmVhazsKKwogICAgIC8qID09PT09PSBNVkVQT05fSU9DVExfU0lMRU5DRSA9PT09PT09PT09PT09PT09PT09PSAqLwogICAgIGNhc2UgTVZFUE9OX0lPQ1RMX1NJTEVOQ0U6CiAgICAgICBpZihjb3B5X2Zyb21fdXNlcigmaW9jdGxTaWxlbmNlLCAoU19FcG9uSW9jdGxTaWxlbmNlKilhcmcsIHNpemVvZihTX0Vwb25Jb2N0bFNpbGVuY2UpKSkKQEAgLTkyNSw3ICsxMTQxLDcgQEAKIAogICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOwogICAgICAgICAKLSAgICAgICAgc3RhdHVzID0gb251RXBvbkRiUDJQRm9yY2VNb2RlU2V0KGlvY3RsU3RhdGUpOworICAgICAgICBvbnVFcG9uRGJQMlBGb3JjZU1vZGVTZXQoaW9jdGxTdGF0ZSk7CiAgICAgICAgIAogICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZXBvbi9lcG9uT251TG54S3NNSS5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmgKaW5kZXggZDczYjRlMy4uZmU0YWEzOSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc01JLmgKQEAgLTk4LDYgKzk4LDEwIEBACiAjZGVmaW5lIE1WRVBPTl9JT0NUTF9URE1fUVVFX0NGRyAgIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDE0LCB1bnNpZ25lZCBpbnQpDQogI2RlZmluZSBNVkVQT05fSU9DVExfQUxBUk1fR0VUICAgICBfSU9SKE1WUE9OX0lPQ1RMX01BR0lDLCAxNSwgdW5zaWduZWQgaW50KQ0KICNkZWZpbmUgTVZFUE9OX0lPQ1RMX1JPR1VFX09OVV9TRVQgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMTYsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgTVZFUE9OX0lPQ1RMX0xPU19USU1FICAgICAgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMTcsIHVuc2lnbmVkIGludCkNCisjZGVmaW5lIE1WRVBPTl9JT0NUTF9UWF9DT05UUk9MICAgIF9JT1coTVZQT05fSU9DVExfTUFHSUMsIDE4LCB1bnNpZ25lZCBpbnQpDQorI2RlZmluZSBNVkVQT05fSU9DVExfUE9XRVJfU0FWSU5HICBfSU9XKE1WUE9OX0lPQ1RMX01BR0lDLCAxOSwgdW5zaWduZWQgaW50KQ0KKyNkZWZpbmUgTVZFUE9OX0lPQ1RMX0NPTlRST0xfU0xFRVAgX0lPVyhNVlBPTl9JT0NUTF9NQUdJQywgMjAsIHVuc2lnbmVkIGludCkNCiANCiAjZGVmaW5lIEVQT05fTUFYX05VTV9PRl9NQUMgICAgICAgICAgKDgpDQogI2RlZmluZSBFUE9OX01BWF9OVU1fT0ZfUVVFVUUgICAgICAgICg4KQ0KQEAgLTE0Miw5ICsxNDYsMzAgQEAKIHsNCiAgIEVfRVBPTl9JT0NUTF9TVERfTU9ERSwNCiAgIEVfRVBPTl9JT0NUTF9QMlBfTU9ERSwNCi0gIEVfRVBPTl9JT0NUTF9NQVhfTU9ERV9OVU0NCisgIEVfRVBPTl9JT0NUTF9NQVhfTU9ERV9OVU0sDQogfUVfRXBvbklvY3RsTW9kZTsNCiANCit0eXBlZGVmIGVudW0NCit7DQorICAgIEVfRVBPTl9JT0NUTF9FTkFCTEVfVFggICAgICAgID0gMCwgDQorICAgIEVfRVBPTl9JT0NUTF9ESVNBQkxFX1RYICAgICAgID0gMSwgDQorICAgIEVfRVBPTl9JT0NUTF9ESVNBQkxFX1RYX0RFTEFZID0gMiwgDQorfSBFX0Vwb25Jb2N0bFR4Q29udHJvbDsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIEVfR1BPTl9TTEVFUF9BQ1RJT05fRElTQUJMRSA9IDAsIA0KKyAgICBFX0dQT05fU0xFRVBfQUNUSU9OX0VOQUJMRSAgPSAxLCANCisgICAgRV9HUE9OX1NMRUVQX0FDVElPTl9DT05GSUcgID0gMiwgDQorfSBFX0dwb25TbGVlcEFjdGlvbjsNCisNCit0eXBlZGVmIGVudW0NCit7DQorICAgIEVfR1BPTl9TTEVFUF9NT0RFX0RPX05PVEhJTkcgPSAwLCANCisgICAgRV9HUE9OX1NMRUVQX01PREVfVFggICAgICAgICA9IDEsIA0KKyAgICBFX0dQT05fU0xFRVBfTU9ERV9UWF9SWCAgICAgID0gMiwgDQorfSBFX0dwb25TbGVlcE1vZGU7DQorDQogLyogVHlwZWRlZnMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KIC8qIFRYIENvdW50ZXJzICovDQpAQCAtMjkyLDYgKzMxNywzMiBAQAogICBNVl9VMzIgaG9sZG92ZXJUaW1lOw0KIH1TX0Vwb25Jb2N0bEhvbGRPdmVyOw0KIA0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1aW50MTZfdCBvcHRpY2FsX2xvc190aW1lOw0KKyAgICB1aW50MTZfdCBtYWNfbG9zX3RpbWU7DQorfSBTX0Vwb25Jb2N0bExvc1RpbWU7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQxNl90IGFjdGlvbjsNCisgICAgdWludDE2X3QgdGltZTsNCit9IFNfRXBvbklvY3RsVHhDb250cm9sOw0KKw0KK3R5cGVkZWYgc3RydWN0DQorew0KKyAgICB1aW50OF90ICBlYXJseVdha2VVcDsNCisgICAgdWludDY0X3QgbWF4U2xlZXBEdXJhdGlvbjsNCit9IFNfRXBvbklvY3RsUG93ZXJTYXZpbmc7DQorDQordHlwZWRlZiBzdHJ1Y3QNCit7DQorICAgIHVpbnQ4X3QgIGFjdGlvbjsNCisgICAgdWludDhfdCAgc2xlZXBNb2RlOw0KKyAgICB1aW50MzJfdCBzbGVlcER1cmF0aW9uOw0KKyAgICB1aW50MzJfdCB3YWl0RHVyYXRpb247DQorfSBTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcDsNCisNCiAvKiBTaWxlbmNlICovDQogdHlwZWRlZiBzdHJ1Y3QNCiB7DQpAQCAtMzM1LDYgKzM4NiwxMSBAQAogTVZfU1RBVFVTIG9udUVwb25NbmdJbnRlcmZhY2VSZWxlYXNlKHZvaWQpOw0KIHZvaWQgICAgICBvbnVFcG9uTWlOb3RpZnlDYWxsYmFjayhNVl9VMzIgb251U3RhdGUpOw0KIA0KK01WX1NUQVRVUyBvbnVFcG9uTWlMb3NUaW1lQ29uZmlnKFNfRXBvbklvY3RsTG9zVGltZSAqaW9jdGxMb3NUaW1lKTsNCitNVl9TVEFUVVMgb251RXBvbk1pVHhQb3dlckNvbnRyb2xDb25maWcoU19FcG9uSW9jdGxUeENvbnRyb2wgKmlvY3RsVHhDb250cm9sKTsNCitNVl9TVEFUVVMgb251RXBvbk1pUG93ZXJTYXZpbmdDb25maWcoU19FcG9uSW9jdGxQb3dlclNhdmluZyAqaW9jdGxQb3dlclNhdmluZyk7DQorTVZfU1RBVFVTIG9udUVwb25NaUNvbnRyb2xTbGVlcENvbmZpZyhTX0Vwb25Jb2N0bENvbnRyb2xTbGVlcCAqaW9jdGxDb250cm9sU2xlZXApOw0KKw0KIE1WX1NUQVRVUyBtdlAyUFN0YXJ0KHZvaWQpOw0KIE1WX1NUQVRVUyBtdlAyUFN0b3Aodm9pZCk7DQogLyogTWFjcm9zDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuYwppbmRleCBhNDlkODMxLi42NmRiYmIwIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiAvKiBMb2NhbCBWYXJpYWJsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBNVl9CT09MIGluZm9FcG9uQ250UmVhZENsZWFySW5kID0gTVZfVFJVRTsKLXN0YXRpYyBTX0Vwb25Jb2N0bERiYSBpb2N0bERiYTsKIAogLyogRXhwb3J0IEZ1bmN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTg4MiwxNCArODgxLDE1IEBACiAJCQkJCQkJCQkJIkludGVycnVwdFxuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbI1F1ZXVlXVtUaHJlc2hdPiBkZ0NmZyAgICAgICAgICAgIC0gY29uZmlndXJlIER5aW5nIEdhc3AgREJBIHJlcG9ydFxuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbbW9kdWxlXVtMZXZlbF1bT3B0aW9uc10gPiBwcmludE1hc2sgLSBjaGFuZ2UgcHJpbnRpbmcgb3B0aW9uc1xuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbZW5hYmxlXVtwYXR0ZXJuXVtidXJzdF1bZHVyYXRpb25dXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgIFtwZXJpb2RdICAgICAgICA+IHBhdHRlcm4gICAgICAgICAgLSBzdGFydCBlbmFibGVbMV0gb3Igc3RvcFswXSB0cmFuc21pc3Npb24iCi0JCQkJCQkJCQkJIiBvZiBwYXR0ZXJuOiAweDEtMVQsIDB4Mi0yVCwgMHg4MC1SUEJTIgotCQkJCQkJCQkJCSItOSwgMHg4Mi1SUEJTLTE1LCAweDgzLVJQQlMtMjMgaW4gIgotCQkJCQkJCQkJCSJidXJzdDogMC1zdGF0aWMsIDEtIHBlcmlvZGljIGZvciAiCi0JCQkJCQkJCQkJImR1cmF0aW9uOiBwZWFjIHRpbWUgaW50ZXJ2YWwiCi0JCQkJCQkJCQkJIlttaWNybyBzZWNvbmRzXSBpbiBwZXJpb2QgLSBmdWxsIGNpY2xlIgotCQkJCQkJCQkJCSIgdGltZSBpbnRlcnZhbFttaWNybyBzZWNvbmRzXVxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbYWN0aW9uXVt0aW1lXSAgPiB0eFBvd2VyQ29udHJvbCAgIC0gYWN0aW9uKDA6ZW5hYmxlLDE6ZGlzYWJsZSwyOnNodXQgZG93biB0aGVuIGVuYWJsZSlcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW2VuYWJsZV1bdGltZV0gID4gcG93ZXJTYXZpbmcgICAgICAtIGNvbmZpZ3VyZSBlYXJseSB3YWtldXAgYW5kIG1heCBzbGVlcCBkdXJhdGlvblxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbYWN0aW9uXVttb2RlXVt0aW1lXVt0aW1lXSA+IHNsZWVwQ29udHJvbCAtIGNvbmZpZ3VyZSBzbGVlcC93YWtldXAgcGFyYW1ldGVyc1xuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbcGF0dGVybk1TQl1bcGF0dGVybl1bcGF0dGVybkxTQl1cbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgID4gcHJic1VzZXJEZWZpbmVkUGF0dGVybiAtIDgwYml0IHVzZXIgZGF0YTogMTZiaXQgcGF0dGVybk1MU0IgKyAzMmJpdCBwYXR0ZXJuICsgMzJiaXQgcGF0dGVybkxTQlxuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbZW5hYmxlXVtwYXR0ZXJuXVtidXJzdF1bZHVyYXRpb25dW3BlcmlvZF0gXG4iKTsKKyAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICA+IHByYnNQcmVEZWZpbmVkUGF0dGVybiAtIHN0YXJ0IGVuYWJsZVsxXSBvciBzdG9wIFswXSB0cmFuc21pc3Npb24gb2ZcbiIpOworICAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IDB4MS0xVCwgMHgyLTJULCAweDUtVXNlciwgMHg4MC1QUkJTLTcsIDB4ODEtUFJCUy05LCAweDgyLVBSQlMtMTUsIDB4ODMtUFJCUy0yM1xuIik7CisgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVyc3Q6IDAtc3RhdGljLCAxLXBlcmlvZGljXG4iKTsKIAlpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKIAkJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbbGF0ZW5jeV1bc2l6ZV0gPiBwY3NGcmFtZUxpbWl0cyAgIC0gQ29uZmlndXJlIFBDUyBGcmFtZSBTaXplICIKIAkJCQkJCQkJCQkJImxpbWl0c1xuIik7CkBAIC05MDQsNiArOTA0LDcgQEAKIAlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGNhdCBwcmludE1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGR1bXAgcHJpbnRpbmcgb3B0aW9uc1xuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgY2F0IGRiYVN3Q2ZnUHJpbnQgICAgICAgICAgICAgICAgICAgICAgIC0gZHVtcCBEQkEgY2ZnXG4iKTsKKyAgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGNhdCBwcmJzVXNlclBhdHRlcm4gICAgICAgICAgICAgICAgICAgICAtIGR1bXAgUFJCUyB1c2VyIGRlZmluZWQgcGF0dGVyblxuIik7CiAJaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7CiAJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGNhdCBwY3NGcmFtZUxpbWl0cyAgICAgICAgICAgICAgICAgICAgIC0gZHVtcCBQQ1MgRnJhbWUgU2l6ZSBMaW1pdHNcbiIpOwogCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBjYXQgcnhEYXRhRmlmb1RocmVzaCAgICAgICAgICAgICAgICAgICAtIGR1bXAgUlggUGFyc2VyIERhdGEgRklGTyAiCkBAIC0xMDg5LDYgKzEwOTAsNyBAQAogICBNVl9VMzIgICAgICAgICBpZHg7CiAgIE1WX1UzMiAgICAgICAgIHFzZXRpZHg7CiAgIE1WX1UzMiAgICAgICAgIG51bU9mUXVldWVzID0gMDsKKyAgU19FcG9uSW9jdGxEYmEgaW9jdGxEYmE7CiAKICAgbWVtc2V0ICgmaW9jdGxEYmEsIDAsIHNpemVvZihTX0Vwb25Jb2N0bERiYSkpOwogCkBAIC0xMjgzLDcgKzEyODUsMzIgQEAKICAgcmV0dXJuKG9mZik7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25VaUNmZ1ByYnNVc2VyUGF0dGVybgorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBwcmludCBQUkJTIHVzZXIgZGVmaW5lZCBwYXR0ZXJuCisqKgorKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKKyoqCisqKiAgT1VUUFVUUzogICAgIGNoYXIqIGJ1ZgorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgb251RXBvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuKGNoYXIqIGJ1ZikKK3sKKyAgTVZfVTMyIHVzZXJQYXR0ZXJuWzNdOworICBpbnQgb2ZmID0gMDsKIAorICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQodXNlclBhdHRlcm4pOworCisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUFJCUyBVc2VyIFBhdHRlcm4gMHglNHglOHglOHhcbiIsCisJCSAgICAgdXNlclBhdHRlcm5bMl0sIHVzZXJQYXR0ZXJuWzFdLCB1c2VyUGF0dGVyblswXSk7CisKKyAgcmV0dXJuKG9mZik7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgpAQCAtMTM5MCwxMCArMTQxNywxMSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKioKLSoqICBvbnVFcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QKKyoqICBvbnVFcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0CiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKLSoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGNvbmZpZyBzdGFydC9zdG9wIG9udSB0cmFuc21pc3Npb24gb2YgcGF0dGVybiBidXJzdAorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0L3N0b3Agb251IHRyYW5zbWlzc2lvbiBvZiB1c2VyIGRlZmluZWQKKyoqICAgICAgICAgICAgICAgcGF0dGVybiBidXJzdAogKioKICoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCiAqKgpAQCAtMTQwMiw3ICsxNDMwLDMzIEBACiAqKiAgUkVUVVJOUzogICAgIHZvaWQKICoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBvbnVFcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QoTVZfVTMyIGVuYWJsZSwgTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBidXJzdCwgTVZfVTMyIGR1cmF0aW9uLCBNVl9VMzIgcGVyaW9kKQordm9pZCBvbnVFcG9uVWlDZmdTZXRVc2VyUGF0dGVybkJ1cnN0KE1WX1UzMiBwYXR0ZXJuTVNCLCBNVl9VMzIgcGF0dGVybiwgTVZfVTMyIHBhdHRlcm5MU0IpCit7CisgIE1WX1UzMiB1c2VyUGF0dGVyblszXTsKKworICB1c2VyUGF0dGVyblswXSA9IHBhdHRlcm5MU0I7CisgIHVzZXJQYXR0ZXJuWzFdID0gcGF0dGVybjsKKyAgdXNlclBhdHRlcm5bMl0gPSBwYXR0ZXJuTVNCOworCisgIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVyblNldCh1c2VyUGF0dGVybik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0L3N0b3Agb251IHRyYW5zbWlzc2lvbiBvZiBwcmUtZGVmaW5lZAorKiogICAgICAgICAgICAgICBwYXR0ZXJuIGJ1cnN0CisqKgorKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKKyoqCisqKiAgT1VUUFVUUzogICAgIGNoYXIqIGJ1ZgorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QoTVZfVTMyIGVuYWJsZSwgTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBidXJzdCwgTVZfVTMyIGR1cmF0aW9uLCBNVl9VMzIgcGVyaW9kKQogewogICBpZiAoZW5hYmxlID09IDApCiAgIHsKQEAgLTE0MTcsNiArMTQ3MSwxMzkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCisqKiAgb251RXBvblVpQ2ZnTG9zVGltZQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBzZXRzIHRoZSB0aW1lIGR1cmF0aW9uIHRvIGJlIHVzZWQgCisqKiAgICAgICAgICAgICAgIHdoZW4gbm8gb3B0aWNhbCBkZXRlY3RlZCBhbmQgbm8gR0FURSBNUENQRFUgcmVjZWl2ZWQKKyoqCisqKiAgUEFSQU1FVEVSUzogIG9wdGljYWxMb3NUaW1lIC0gdGltZSBkdXJhdGlvbiB0byBiZSB1c2VkIHdoZW4gbm8gb3B0aWNhbCBkZXRlY3RlZAorKiogICAgICAgICAgICAgICBtYWNMb3NUaW1lICAgICAtIHRpbWUgZHVyYXRpb24gdG8gYmUgdXNlZCB3aGVuIG5vIEdBVEUgTVBDUERVIHJlY2VpdmVkCisqKiAgT1VUUFVUUzogICAgIHZvaWQKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uVWlDZmdMb3NUaW1lKE1WX1UzMiBvcHRpY2FsTG9zVGltZSwgTVZfVTMyIG1hY0xvc1RpbWUpCit7CisgICAgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVTZXQob3B0aWNhbExvc1RpbWUpOworICAgIG9udUVwb25EYk9udU1hY0xvc1RpbWVTZXQobWFjTG9zVGltZSk7CisKKyAgICAvKiBJZiB0aGUgaG9sZG92ZXIgdGltZXIgaXMgbm90IGFjdGl2ZSwgd2UgYWRkIHRoZSBPcHRpY2FsTG9zVGltZXIgdG8gdGhlIGhvbGRvdmVyIHRpbWUgYW5kIHNhdmUgKi8KKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVQb25Ib2xkb3ZlclRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFKQorICAgIHsKKyAgICAgICAgLyogQWRkIHRoZSBjb25maWd1cmVkIE9wdExvc1RpbWUgdG8gaG9sZG92ZXIgdGltZSBhbmQgc2F2ZSBmb3IgbmV4dCBob2xkb3ZlciAqLworICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251UG9uSG9sZG92ZXJUaW1lcklkKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udUhvbGRvdmVyVGltZUdldCgpICsgb251RXBvbkRiT251T3B0aWNhbExvc1RpbWVHZXQoKSwgMCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uVWlDZmdUeFBvd2VyQ29udHJvbAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBjb250cm9scyB0aGUgVFggcG93ZXIgb24gYW5kIG9mZgorKioKKyoqICBQQVJBTUVURVJTOiAgYWN0aW9uIC0gdHVybiBvbiBhbmQgdHVybiBvZmYgdGhlIFRYIHBvd2VyLCBvciB0dXJuIG9mZiBhZnRlciAKKyoqICAgICAgICAgICAgICAgICAgICAgICAgY2VydGFpbiB0aW1lIGR1cmF0aW9uLgorKiogICAgICAgICAgICAgICB0aW1lICAgLSB0aW1lIGR1cmF0aW9uIHRvIGJlIGV4cGlyZWQgYmVmb3JlIHR1cm5pbmcgb2ZmIFRYCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblVpQ2ZnVHhQb3dlckNvbnRyb2woTVZfVTMyIGFjdGlvbiwgTVZfVTMyIHRpbWUpCit7CisgICAgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRU5BQkxFX1RYKQorICAgIHsKKyAgICAgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCkpOworICAgICAgICBvbnVQb25UeFBvd2VyT24oTVZfVFJVRSk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0VQT05fSU9DVExfRElTQUJMRV9UWCkKKyAgICB7CisgICAgICAgIG9udVBvblRpbWVyRGlzYWJsZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpKTsKKyAgICAgICAgb251UG9uVHhQb3dlck9uKE1WX0ZBTFNFKTsKKyAgICB9CisgICAgZWxzZSBpZiAoYWN0aW9uID09IEVfRVBPTl9JT0NUTF9ESVNBQkxFX1RYX0RFTEFZKQorICAgIHsgICAgICAgIAorICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblR4Q29udHJvbFRpbWVySWQpLCAwLCB0aW1lLCAxKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25VaUNmZ1Bvd2VyU2F2aW5nCisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgdGhlIHBhcmFtZXRlcnMgZm9yIHBvd2VyIHNhdmluZyBtb2RlCisqKgorKiogIFBBUkFNRVRFUlM6ICBlYXJseVdha2V1cCAtIHNldCB0aGUgYWJpbGl0eSBvZiBzdXBwb3J0aW5nIGVhcmx5IHdha2UgdXAKKyoqICAgICAgICAgICAgICAgbWF4U2xlZXBEdXJhdGlvbiAtIHRpbWUgcGVyaW9kIGZvciBrZWVwaW5nIHBvd2VyIHNhdmluZyBtb2RlCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBNVl9UUlVFIG9yIE1WX0ZMQVNFCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblVpQ2ZnUG93ZXJTYXZpbmcoTVZfVTMyIGVhcmx5V2FrZXVwLCBNVl9VMzIgbWF4U2xlZXBEdXJhdGlvbikKK3sgICAgCisgICAgaWYgKChvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCkgKyBvbnVFcG9uRGJPbnVXYWtldXBEdXJhdGlvbkdldCgpKSA+PSBtYXhTbGVlcER1cmF0aW9uKQorICAgIHsKKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLAorICAgICAgICAJICAgICAgICJFUlJPUjogV3JvbmcgcGFyYW1ldGVycywgc2xlZXAoJWQpICsgd2FrZXVwKCVkKSA+PSBtYXhTbGVlcER1cmF0aW9uKCVkKVxyXG4iLCAKKyAgICAgICAgCSAgICAgICBvbnVFcG9uRGJPbnVTbGVlcER1cmF0aW9uR2V0KCksIG9udUVwb25EYk9udVdha2V1cER1cmF0aW9uR2V0KCksIAorICAgICAgICAJICAgICAgIG1heFNsZWVwRHVyYXRpb24pOworCisgICAgICAgIHJldHVybiBNVl9CQURfUEFSQU07CisgICAgfQorCisgICAgb251RXBvbkRiT251UG93ZXJTYXZpbmdXYWtldXBTZXQoZWFybHlXYWtldXApOworICAgIG9udUVwb25EYk9udVBvd2VyU2F2aW5nTWF4U2xlZXBEdXJhdGlvblNldChtYXhTbGVlcER1cmF0aW9uKTsKKworICAgIGlmIChvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpCisgICAgeworICAgICAgICBvbnVQb25UaW1lclVwZGF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvbk1heFNsZWVwVGltZXJJZCksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTbGVlcER1cmF0aW9uLCAxKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25VaUNmZ0NvbnRyb2xTbGVlcAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiB0cmlnZ2VycyB0aGUgYWN0aW9uIG9mIHBvd2VyIG1vZGUgdHJhbnNmb3JtYXRpb24KKyoqCisqKiAgUEFSQU1FVEVSUzogIGFjdGlvbiAgICAgICAgIC0gZW5hYmxlLCBkaXNhYmxlIG9yIGNvbmZpZ3VyZQorKiogICAgICAgICAgICAgICBzbGVlcE1vZGUgICAgICAtIHR1cm4gb2ZmIHR4IG9yIHR4L3J4CisqKiAgICAgICAgICAgICAgIHNsZWVwRHVyYXRpb24gIC0gcGVyaW9kaWNhbCB0aW1lIGR1cmF0aW9uIGZvciBzbGVlcAorKiogICAgICAgICAgICAgICB3YWtldXBEdXJhdGlvbiAtIHBlcmlvZGljYWwgdGltZSBkdXJhdGlvbiBmb3Igd2FrZXVwCisqKgorKiogIE9VVFBVVFM6ICAgICBOb25lCisqKgorKiogIFJFVFVSTlM6ICAgICBOb25lCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblVpQ2ZnQ29udHJvbFNsZWVwKE1WX1UzMiBhY3Rpb24sIE1WX1UzMiBzbGVlcE1vZGUsIE1WX1UzMiBzbGVlcER1cmF0aW9uLCBNVl9VMzIgd2FrZXVwRHVyYXRpb24pCit7CisgICAgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0RJU0FCTEUpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxEaXNhYmxlKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGFjdGlvbiA9PSBFX0dQT05fU0xFRVBfQUNUSU9OX0VOQUJMRSkKKyAgICB7CisgICAgICAgIG12RXBvbkFwaVNsZWVwQ3RybEVuYWJsZSgpOworICAgIH0KKyAgICBlbHNlIGlmIChhY3Rpb24gPT0gRV9HUE9OX1NMRUVQX0FDVElPTl9DT05GSUcpCisgICAgeworICAgICAgICBtdkVwb25BcGlTbGVlcEN0cmxDZmcoc2xlZXBNb2RlLCBzbGVlcER1cmF0aW9uLCB3YWtldXBEdXJhdGlvbik7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKICoqICBvbnVFcG9uVWlDZmdTZXRQY3NGcmFtZUxpbWl0cwogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KICoqCkBAIC0xNTczLDkgKzE3NjAsOSBAQAogCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIkZhaWxlZCB0byBvYnRhaW4gMksgcGFja2V0IHN1cHBvcnQgcmVsYXRlZCByZWdpc3RlciB2YWx1ZSFcclxuIik7CiAJZWxzZSB7CiAJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiXHJcbiIpOwotCQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBjc0ZyYW1lU2l6ZUxpbWl0U2l6ZSAgICA9ICUjZFxyXG4iLCBmcmFtZVNpemVMaW1pdFNpemUpOwotICAgICAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIlBjc0ZyYW1lU2l6ZUxpbWl0TGF0ZW5jeSA9ICUjZFxyXG4iLCBmcmFtZVNpemVMaW1pdExhdGVuY3kpOwotICAgICAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIkRhdGFGaWZvVGhyZXNob2xkICAgICAgICA9ICUjZFxyXG4iLCBkYXRhRmlmb1RocmVzaG9sZCk7CisJCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUGNzRnJhbWVTaXplTGltaXRTaXplICAgID0gJWRcclxuIiwgZnJhbWVTaXplTGltaXRTaXplKTsKKyAgICAgICAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICJQY3NGcmFtZVNpemVMaW1pdExhdGVuY3kgPSAlZFxyXG4iLCBmcmFtZVNpemVMaW1pdExhdGVuY3kpOworICAgICAgICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIkRhdGFGaWZvVGhyZXNob2xkICAgICAgICA9ICVkXHJcbiIsIGRhdGFGaWZvVGhyZXNob2xkKTsKIAl9CiAKIAlyZXR1cm4ob2ZmKTsKQEAgLTE4NDgsNiArMjAzNSw4IEBACiAJCXJldHVybihvbnVFcG9uVWlDZmdEYmFDZmdQcmludChidWYpKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJkYmFTdGF0aWNDZmdQcmludCIpKQogCQlyZXR1cm4ob251RXBvblVpQ2ZnRGJhU3RhdGljQ2ZnUHJpbnQoYnVmKSk7CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1VzZXJQYXR0ZXJuIikpCisgICAgICAgIHJldHVybiAob251RXBvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuKGJ1ZikpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhlbHBDZmciKSkKIAkJcmV0dXJuKG9udUVwb25VaUNmZ0hlbHBTaG93KGJ1ZikpOwogCWVsc2UgaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7CkBAIC0xOTIwLDggKzIxMDksMjIgQEAKIAkJb251RXBvblVpQ2ZnRGdDZmcoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmludE1hc2siKSkJCQkJCS8qIG1vZHVsZSwgcHJpbnQgbGV2ZWwsIG9wdGlvbnMgKi8KIAkJcG9uT251Q2hhbmdlUHJpbnRTdGF0dXMoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyk7Ci0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicGF0dGVybiIpKQotCQlvbnVFcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsKE1WX1UzMilwYXJhbTIsKE1WX1UzMilwYXJhbTMsKE1WX1UzMilwYXJhbTQsKE1WX1UzMilwYXJhbTUpOworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInR4UG93ZXJDb250cm9sIikpCisgICAgeworICAgICAgICBvbnVFcG9uVWlDZmdUeFBvd2VyQ29udHJvbCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwb3dlclNhdmluZyIpKQorICAgIHsKKyAgICAgICAgb251RXBvblVpQ2ZnUG93ZXJTYXZpbmcoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic2xlZXBDb250cm9sIikpCisgICAgeworICAgICAgICBvbnVFcG9uVWlDZmdDb250cm9sU2xlZXAoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMywgKE1WX1UzMilwYXJhbTQpOworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzVXNlckRlZmluZWRQYXR0ZXJuIikpCisgICAgICAgIG9udUVwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyk7IC8qIDgwYml0IHVzZXIgZGF0YTogMTZiaXQgcGF0dGVybk1MU0IgKyAzMmJpdCBwYXR0ZXJuICsgMzJiaXQgcGF0dGVybkxTQlxuIiAqLworICAgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNQcmVEZWZpbmVkUGF0dGVybiIpKQorICAgICAgICBvbnVFcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0KChNVl9VMzIpcGFyYW0xLCAoTVZfVTMyKXBhcmFtMiwgKE1WX1UzMilwYXJhbTMgLCAoTVZfVTMyKXBhcmFtNCAsIChNVl9VMzIpcGFyYW01KTsgIC8qIHBhdHRlcm4gdHlwZSwgYnVyc3QgdHlwZSwgZHVyYXRpb24sIHBlcmlvZCAqLwogCWVsc2UgaWYgKGRldklkID09IE1WXzY2MDFfREVWX0lEKSB7CiAJCWlmICghc3RyY21wKG5hbWUsICJwY3NGcmFtZUxpbWl0cyIpKQogCQkJb251RXBvblVpQ2ZnU2V0UGNzRnJhbWVMaW1pdHMoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yKTsKQEAgLTE5NjQsMTIgKzIxNjcsMTcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihzaWxlbmNlU2ltLCAgICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZGdEZWJ1ZywgICAgICAgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGRnQ2ZnLCAgICAgICAgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKLXN0YXRpYyBERVZJQ0VfQVRUUihwYXR0ZXJuLCAgICAgICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1VzZXJQYXR0ZXJuLCAgICAgICAgIFNfSVJVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHByYnNVc2VyRGVmaW5lZFBhdHRlcm4sICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzUHJlRGVmaW5lZFBhdHRlcm4sICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocHJpbnRNYXNrLCAgICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihwY3NGcmFtZUxpbWl0cywgICAgICAgICAgU19JV1VTUiB8IFNfSVJVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHJ4RGF0YUZpZm9UaHJlc2gsICAgICAgICBTX0lXVVNSIHwgU19JUlVTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZGRtVHhQb2xhcml0eSwgICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHBrdDJrRW4sICAgICAgICAgICAgICAgICBTX0lXVVNSIHwgU19JUlVTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIodHhQb3dlckNvbnRyb2wsICAgICAgICAgIFNfSVdVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOworc3RhdGljIERFVklDRV9BVFRSKHBvd2VyU2F2aW5nLCAgICAgICAgICAgICBTX0lXVVNSLCBjZmdfc2hvdywgY2ZnX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzbGVlcENvbnRyb2wsICAgICAgICAgICAgU19JV1VTUiwgY2ZnX3Nob3csIGNmZ19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoaGVscENmZywgICAgICAgICAgICAgICAgIFNfSVJVU1IsIGNmZ19zaG93LCBjZmdfc3RvcmUpOwogIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNmZ19hdHRyc1tdID0gewpAQCAtMTk5MCwxMiArMjE5OCwxNyBAQAogCSZkZXZfYXR0cl9zaWxlbmNlU2ltLmF0dHIsCiAJJmRldl9hdHRyX2RnRGVidWcuYXR0ciwKIAkmZGV2X2F0dHJfZGdDZmcuYXR0ciwKLQkmZGV2X2F0dHJfcGF0dGVybi5hdHRyLAorCSZkZXZfYXR0cl9wcmJzVXNlclBhdHRlcm4uYXR0ciwKKwkmZGV2X2F0dHJfcHJic1VzZXJEZWZpbmVkUGF0dGVybi5hdHRyLAorCSZkZXZfYXR0cl9wcmJzUHJlRGVmaW5lZFBhdHRlcm4uYXR0ciwKIAkmZGV2X2F0dHJfcHJpbnRNYXNrLmF0dHIsCiAJJmRldl9hdHRyX3Bjc0ZyYW1lTGltaXRzLmF0dHIsCiAJJmRldl9hdHRyX3J4RGF0YUZpZm9UaHJlc2guYXR0ciwgCiAJJmRldl9hdHRyX2RkbVR4UG9sYXJpdHkuYXR0ciwKIAkmZGV2X2F0dHJfcGt0MmtFbi5hdHRyLCAKKwkmZGV2X2F0dHJfdHhQb3dlckNvbnRyb2wuYXR0ciwgCisJJmRldl9hdHRyX3Bvd2VyU2F2aW5nLmF0dHIsIAorCSZkZXZfYXR0cl9zbGVlcENvbnRyb2wuYXR0ciwgCiAJJmRldl9hdHRyX2hlbHBDZmcuYXR0ciwKIAlOVUxMCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGVyZi9lcG9uL2Vwb25PbnVMbnhLc1VJLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuaAppbmRleCBmOGM5Y2RlLi5hNmU5MmYxIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2Vwb24vZXBvbk9udUxueEtzVUkuaApAQCAtOTYsNiArOTYsMTIgQEAKIE1WX1NUQVRVUyBvbnVFcG9uVXNySW50ZXJmYWNlQ3JlYXRlKHZvaWQpOw0KIE1WX1NUQVRVUyBvbnVFcG9uVXNySW50ZXJmYWNlUmVsZWFzZSh2b2lkKTsNCiANCit2b2lkIG9udUVwb25VaUNmZ0xvc1RpbWUoTVZfVTMyIG9wdGljYWxMb3NUaW1lLCBNVl9VMzIgbWFjTG9zVGltZSk7DQordm9pZCBvbnVFcG9uVWlDZmdUeFBvd2VyQ29udHJvbChNVl9VMzIgYWN0aW9uLCBNVl9VMzIgdGltZSk7DQordm9pZCBvbnVFcG9uVWlDZmdQb3dlclNhdmluZyhNVl9VMzIgZWFybHlXYWtldXAsIE1WX1UzMiBtYXhTbGVlcER1cmF0aW9uKTsNCit2b2lkIG9udUVwb25VaUNmZ0NvbnRyb2xTbGVlcChNVl9VMzIgYWN0aW9uLCBNVl9VMzIgc2xlZXBNb2RlLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9VMzIgc2xlZXBEdXJhdGlvbiwgTVZfVTMyIHdha2V1cER1cmF0aW9uKTsNCisNCiAvKiBNYWNyb3MNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCiANCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wZXJmL2dwb24vZ3Bvbk9udUxueEtzVUkuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZ3Bvbi9ncG9uT251TG54S3NVSS5jCmluZGV4IGQzYmY1ZWYuLmNmNDUwNzUgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZ3Bvbi9ncG9uT251TG54S3NVSS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BlcmYvZ3Bvbi9ncG9uT251TG54S3NVSS5jCkBAIC0yOTQ2LDEwICsyOTQ2LDExIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqICBvbnVHcG9uVWlDZmdTZXRQYXR0ZXJuQnVyc3QKKyoqKiogIG9udUdwb25VaUNmZ1NldFVzZXJQYXR0ZXJuQnVyc3QKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgotKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0IG9udSB0cmFuc21pc3Npb24gb2YgcGF0dGVybiBidXJzdAorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0IG9udSB0cmFuc21pc3Npb24gb2YgdXNlci1kZWZpbmVkCisqKiAgICAgICAgICAgICAgIHBhdHRlcm4gYnVyc3QKICoqCiAqKiAgUEFSQU1FVEVSUzogIGNoYXIqIGJ1ZgogKioKQEAgLTI5NTgsMTEgKzI5NTksMzQgQEAKICoqICBSRVRVUk5TOiAgICAgdm9pZAogKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIG9udUdwb25VaUNmZ1NldFBhdHRlcm5CdXJzdChNVl9VMzIgZW5hYmxlLE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgYnVyc3QsIE1WX1UzMiBkdXJhdGlvbiwgTVZfVTMyIHBlcmlvZCkKK3ZvaWQgb251R3BvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdChNVl9VMzIgcGF0dGVybk1TQiwgTVZfVTMyIHBhdHRlcm4sIE1WX1UzMiBwYXR0ZXJuTFNCKQoreworICBNVl9VMzIgdXNlclBhdHRlcm5bM107CisKKyAgdXNlclBhdHRlcm5bMF0gPSBwYXR0ZXJuTFNCOworICB1c2VyUGF0dGVyblsxXSA9IHBhdHRlcm47CisgIHVzZXJQYXR0ZXJuWzJdID0gcGF0dGVybk1TQjsKKworICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5TZXQodXNlclBhdHRlcm4pOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqKiogIG9udUdwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gY29uZmlnIHN0YXJ0IG9udSB0cmFuc21pc3Npb24gb2YgcHJlLWRlZmluZWQKKyoqICAgICAgICAgICAgICAgcGF0dGVybiBidXJzdAorKioKKyoqICBQQVJBTUVURVJTOiAgY2hhciogYnVmCisqKgorKiogIE9VVFBVVFM6ICAgICBjaGFyKiBidWYKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVHcG9uVWlDZmdTZXREZWZpbmVkUGF0dGVybkJ1cnN0KE1WX1UzMiBlbmFibGUsIE1WX1UzMiBwYXR0ZXJuLCBNVl9VMzIgYnVyc3QsIE1WX1UzMiBkdXJhdGlvbiwgTVZfVTMyIHBlcmlvZCkKIHsKIAotICAgIGlmIChlbmFibGUgPT0gMCkKLSAgICB7CisgICAgaWYgKGVuYWJsZSA9PSAwKSB7CiAgICAgICBvbnVQb25QYXR0ZXJuQnVyc3RPZmYoKTsKICAgICB9CiAgICAgZWxzZQpAQCAtMzE5MCw2ICszMjE0LDMzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqKgorKiogIG9udUdwb25VaUNmZ1ByYnNVc2VyUGF0dGVybgorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBwcmludCBQUkJTIHVzZXIgZGVmaW5lZCBwYXR0ZXJuCisqKgorKiogIFBBUkFNRVRFUlM6ICBjaGFyKiBidWYKKyoqCisqKiAgT1VUUFVUUzogICAgIGNoYXIqIGJ1ZgorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgb251R3BvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuKGNoYXIqIGJ1ZikKK3sKKyAgTVZfVTMyIHVzZXJQYXR0ZXJuWzNdOworICBpbnQgb2ZmID0gMDsKKworICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQodXNlclBhdHRlcm4pOworCisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiUFJCUyBVc2VyIFBhdHRlcm4gMHglNHglOHglOHhcbiIsCisJCSAgICAgdXNlclBhdHRlcm5bMl0sIHVzZXJQYXR0ZXJuWzFdLCB1c2VyUGF0dGVyblswXSk7CisKKyAgcmV0dXJuKG9mZik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgogKiogIG9udUdwb25VaVN5bmNMb2dFbmFibGUKICoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAqKgpAQCAtMzI2NywxNyArMzMxOCwxNSBAQAogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW21vZHVsZV0gW0xldmVsXSBbT3B0aW9uc10gPiBwcmludE1hc2sgICAgICAgLSBjaGFuZ2UgcHJpbnRpbmcgb3B0aW9uc1xuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbc3RhdGVdICAgICAgICAgICAgICAgICAgICA+IGFkbWluQ2ZnICAgICAgICAtICIKIAkJCQkJCSJjaGFuZ2UgUE9OIEJFIChUWCBFTikgc3RhdGUgMD1FbmFibGUsIDE9RGlzYWJsZVxuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbZW5hYmxlXVtwYXR0ZXJuXVtidXJzdF1bZHVyYXRpb25dW3BlcmlvZF0gPiBwYXR0ZXJuXG4iKTsKLQlvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gIgotCQkJCQkJInN0YXJ0IGVuYWJsZVsxXSBvciBzdG9wIFswXSB0cmFuc21pc3Npb24gb2ZcbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0JCQkJCQkicGF0dGVybjogMHgxLTFULCAweDItMlQsIDB4ODAtUlBCUy05LCAweDgyLVJQQlMtMTUsIDB4ODMtUlBCUy0yM1xuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLQkJCQkJCSJidXJzdDogMC1zdGF0aWMsIDEtcGVyaW9kaWNcbiIpOwotCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0JCQkJCQkiZHVyYXRpb246IHBlYWsgdGltZSBpbnRlcnZhbFttaWNybyBzZWNvbmRzXVxuIik7Ci0Jb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLQkJCQkJCSJwZXJpb2QgLSBmdWxsIGNpY2xlIHRpbWUgaW50ZXJ2YWxbbWljcm8gc2Vjb25kc11cbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiBlY2hvIFtwYXR0ZXJuTVNCXVtwYXR0ZXJuXVtwYXR0ZXJuTFNCXVxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiBwcmJzVXNlckRlZmluZWRQYXR0ZXJuIC0gLyogODBiaXQgdXNlciBkYXRhOiAxNmJpdCBwYXR0ZXJuTUxTQiArIDMyYml0IHBhdHRlcm4gKyAzMmJpdCBwYXR0ZXJuTFNCXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbZW5hYmxlXVtwYXR0ZXJuXVtidXJzdF1bZHVyYXRpb25dW3BlcmlvZF1cbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gcHJic1ByZURlZmluZWRQYXR0ZXJuXG4iKTsKKyAgb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0YXJ0IGVuYWJsZVsxXSBvciBzdG9wIFswXSB0cmFuc21pc3Npb24gb2ZcbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogMHgxLTFULCAweDItMlQsIDB4NS1Vc2VyLCAweDgwLVBSQlMtNywgMHg4MS1QUkJTLTksIDB4ODItUFJCUy0xNVxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJzdDogMC1zdGF0aWMsIDEtcGVyaW9kaWNcbiIpOworICBvZmYgKz0gbXZPc1NQcmludGYoYnVmK29mZiwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHBlYWsgdGltZSBpbnRlcnZhbFttaWNybyBzZWNvbmRzXVxuIik7CisgIG9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2QgLSBmdWxsIGN5Y2xlIHRpbWUgaW50ZXJ2YWxbbWljcm8gc2Vjb25kc11cbiIpOwogCW9mZiArPSBtdk9zU1ByaW50ZihidWYrb2ZmLCAiIGVjaG8gW1QwMSBJbnRlcnZhbF0gICAgICAgICAgICAgPiB0MDFJbnRlcnZhbENmZyAgLSAiCiAJCQkJCQkiY29uZmlnIFQwMSB0aW1lciBpbnRlcnZhbCBpbiBtU1xuIik7CiAJb2ZmICs9IG12T3NTUHJpbnRmKGJ1ZitvZmYsICIgZWNobyBbVDAyIEludGVydmFsXSAgICAgICAgICAgICA+IHQwMkludGVydmFsQ2ZnICAtICIKQEAgLTMyOTYsNyArMzM0NSw3IEBACiBpbnQgb251R3BvblVpU3luY0xvZ0VuYWJsZVNob3coKQogewogICAgIHByaW50aygiVGhlIFN5bmMgTG9nIGlzICIpOwotICAgIAorCiAgICAgaWYgKG9udUdwb25Mb2dFbmFibGUgPT0gTVZfVFJVRSkKICAgICB7CiAgICAgICAgIHByaW50aygiZW5hYmxlZFxyXG4iKTsKQEAgLTMzMDUsNyArMzM1NCw3IEBACiAgICAgewogICAgICAgICBwcmludGsoImRpc2FibGVkXHJcbiIpOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0zMzQyLDYgKzMzOTEsOCBAQAogCiAJaWYgKCFzdHJjbXAobmFtZSwgInByaW50TWFzayIpKQogCQlyZXR1cm4gcG9uT251UHJpbnRTdGF0dXMoYnVmKTsKKyAgZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicHJic1VzZXJQYXR0ZXJuIikpCisgIAlyZXR1cm4gb251R3BvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuKGJ1Zik7CiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiaGVscE1pc2MiKSkKIAkJcmV0dXJuIG9udUdwb25VaU1pc2NIZWxwU2hvdyhidWYpOwogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInN5bmNMb2dFbmFibGUiKSkJLyogc3luYyBsb2cgZW5hYmxlIG9yIGRpc2FibGUgKi8KQEAgLTMzOTksOSArMzQ1MCwxMCBAQAogI2VuZGlmIC8qIE1WX0dQT05fUEVSRk9STUFOQ0VfQ0hFQ0sgKi8KIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmludE1hc2siKSkJCS8qIG1vZHVsZSwgcHJpbnQgbGV2ZWwsIG9wdGlvbnMgKi8KIAkJcG9uT251Q2hhbmdlUHJpbnRTdGF0dXMoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyk7Ci0JZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicGF0dGVybiIpKQkJLyogcGF0dGVybiB0eXBlLCBidXJzdCB0eXBlLCBkdXJhdGlvbiwgcGVyaW9kICovCi0JCW9udUdwb25VaUNmZ1NldFBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zICwKLQkJCQkJICAgIChNVl9VMzIpcGFyYW00ICwgKE1WX1UzMilwYXJhbTUpOworICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJwcmJzVXNlckRlZmluZWRQYXR0ZXJuIikpCisgICAgb251R3BvblVpQ2ZnU2V0VXNlclBhdHRlcm5CdXJzdCgoTVZfVTMyKXBhcmFtMSwgKE1WX1UzMilwYXJhbTIsIChNVl9VMzIpcGFyYW0zKTsgLyogODBiaXQgdXNlciBkYXRhOiAxNmJpdCBwYXR0ZXJuTUxTQiArIDMyYml0IHBhdHRlcm4gKyAzMmJpdCBwYXR0ZXJuTFNCXG4iICovCisgIGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInByYnNQcmVEZWZpbmVkUGF0dGVybiIpKQorICAgIG9udUdwb25VaUNmZ1NldERlZmluZWRQYXR0ZXJuQnVyc3QoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMyAsIChNVl9VMzIpcGFyYW00ICwgKE1WX1UzMilwYXJhbTUpOyAgLyogcGF0dGVybiB0eXBlLCBidXJzdCB0eXBlLCBkdXJhdGlvbiwgcGVyaW9kICovCiAJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWRtaW5DZmciKSkJCS8qIGFkbWluIDA9ZW5hYmxlIDEgPSBkaXNhYmxlICovCiAJCW9udUdwb25VaURlYnVnQWRtaW5Nb2RlKChNVl9VMzIpcGFyYW0xKTsKIAllbHNlIGlmICghc3RyY21wKG5hbWUsICJ0MDFJbnRlcnZhbENmZyIpKQkvKiBUMDEgaW50ZXJ2YWwgaW4gbVMgKi8KQEAgLTM0MzUsMTAgKzM0ODcsMTIgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihwbUNoZWNrLCAgICAgICAgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIocG1DbGVhciwgICAgICAgICAgICAgICBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogI2VuZGlmIC8qIE1WX0dQT05fUEVSRk9STUFOQ0VfQ0hFQ0sgKi8KLXN0YXRpYyBERVZJQ0VfQVRUUihwcmludE1hc2ssICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHBhdHRlcm4sICAgICAgICAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzVXNlckRlZmluZWRQYXR0ZXJuLFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CitzdGF0aWMgREVWSUNFX0FUVFIocHJic1ByZURlZmluZWRQYXR0ZXJuLCBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGFkbWluQ2ZnLCAgICAgICAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmludE1hc2ssICAgICAgICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKGhlbHBNaXNjLCAgICAgICAgICAgICAgU19JUlVTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihwcmJzVXNlclBhdHRlcm4sICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSLCBtaXNjX3Nob3csIG1pc2Nfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHQwMUludGVydmFsQ2ZnLCAgICAgICAgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0MDJJbnRlcnZhbENmZywgICAgICAgIFNfSVdVU1IsIG1pc2Nfc2hvdywgbWlzY19zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc3luY0xvZ0VuYWJsZSwgICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiwgbWlzY19zaG93LCBtaXNjX3N0b3JlKTsKQEAgLTM0NTksMTAgKzM1MTMsMTIgQEAKIAkmZGV2X2F0dHJfcG1DaGVjay5hdHRyLAogCSZkZXZfYXR0cl9wbUNsZWFyLmF0dHIsCiAjZW5kaWYgLyogTVZfR1BPTl9QRVJGT1JNQU5DRV9DSEVDSyAqLworCSZkZXZfYXR0cl9wcmJzVXNlckRlZmluZWRQYXR0ZXJuLmF0dHIsCisJJmRldl9hdHRyX3ByYnNQcmVEZWZpbmVkUGF0dGVybi5hdHRyLAorCSZkZXZfYXR0cl9hZG1pbkNmZy5hdHRyLAogCSZkZXZfYXR0cl9wcmludE1hc2suYXR0ciwKIAkmZGV2X2F0dHJfaGVscE1pc2MuYXR0ciwKLQkmZGV2X2F0dHJfcGF0dGVybi5hdHRyLAotCSZkZXZfYXR0cl9hZG1pbkNmZy5hdHRyLAorCSZkZXZfYXR0cl9wcmJzVXNlclBhdHRlcm4uYXR0ciwKIAkmZGV2X2F0dHJfdDAxSW50ZXJ2YWxDZmcuYXR0ciwKIAkmZGV2X2F0dHJfdDAySW50ZXJ2YWxDZmcuYXR0ciwKIAkmZGV2X2F0dHJfc3luY0xvZ0VuYWJsZS5hdHRyLApAQCAtMzUwNSw4ICszNTYxLDggQEAKIAllbHNlIGlmIChkZXZJZCA9PSBNVl82NjAxX0RFVl9JRCkgewogCQlpZiAoIXN0cmNtcChuYW1lLCAiYWNDb3VwbGluZyIpKQogCQkJcmV0dXJuIG9udUdwb25VaURlYnVnTWFuYWdlckFjQ291cGxpbmdHZXQoYnVmKTsKLQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiYWN0aXZlVHhCbSIpKQotCQkJcmV0dXJuIG9udUdwb25VaURlYnVnTWFuYWdlckFjdGl2ZVR4Qml0bWFwR2V0KGJ1Zik7CisJICAgICAgICBlbHNlIGlmICghc3RyY21wKG5hbWUsICJhY3RpdmVUeEJtIikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb251R3BvblVpRGVidWdNYW5hZ2VyQWN0aXZlVHhCaXRtYXBHZXQoYnVmKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTY0LDcgKzM2MjAsNyBAQAogCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImZpZm9TdXBwb3J0IikpCQkvKiBlbmFibGUvZGlzYWJsZSAqLwogCQlvbnVHcG9uVWlEZWJ1Z01hbmFnZXJGaWZvU3VwcG9ydFNldCgoTVZfVTMyKXBhcmFtMSk7CiAJZWxzZSBpZiAoZGV2SWQgPT0gTVZfNjYwMV9ERVZfSUQpIHsKLQkJaWYgKCFzdHJjbXAobmFtZSwgImFjQ291cGxpbmciKSkJCisJCWlmICghc3RyY21wKG5hbWUsICJhY0NvdXBsaW5nIikpCiAgICAgICAgICAgICAvKiBtb2RlLCB0aW1lLCBwYXR0ZXJuMSwgcGF0dGVybjIgKi8KIAkJCW9udUdwb25VaURlYnVnTWFuYWdlckFjQ291cGxpbmdTZXQoKE1WX1UzMilwYXJhbTEsIChNVl9VMzIpcGFyYW0yLCAoTVZfVTMyKXBhcmFtMywgKE1WX1UzMilwYXJhbTQpOwogCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJhY3RpdmVUeEJtIikpCQkJCS8qIGJpdG1hcCwgdmFsaWQgKi8KQEAgLTM2MTksNyArMzY3NSw3IEBACiAJJmRldl9hdHRyX3Bsb2FtQnVyc3RDZmcuYXR0ciwKIAkmZGV2X2F0dHJfY2xlYXJGaWZvQ250cy5hdHRyLAogCSZkZXZfYXR0cl9maWZvU3VwcG9ydC5hdHRyLAotCSZkZXZfYXR0cl9hY0NvdXBsaW5nLmF0dHIsIAorCSZkZXZfYXR0cl9hY0NvdXBsaW5nLmF0dHIsCiAJJmRldl9hdHRyX2FjdGl2ZVR4Qm0uYXR0ciwKIAkmZGV2X2F0dHJfaGVscFByb3RvLmF0dHIsCiAJTlVMTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5jCmluZGV4IDdkNWNkOTcuLmNmYjZiNjMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmMKQEAgLTc3LDYgKzc3LDcgQEAKIC8qIEluY2x1ZGUgRmlsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjaW5jbHVkZSAicG9uT251SGVhZGVyLmgiCisjaW5jbHVkZSAiZXBvbk9udURiLmgiCiAKIC8qIExvY2FsIENvbnN0YW50CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC05Miw2ICs5Myw3IEBACiAKIC8qIEV4cG9ydCBGdW5jdGlvbnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitleHRlcm4gTVZfU1RBVFVTIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfVTMyIGVuYWJsZSk7CiAKIC8qIExvY2FsIEZ1bmN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTUzOCw0ICs1NDAsMTI2IEBACiAgIHJldHVybihNVl9PSyk7CiB9CiAjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgb251RXBvblR4Q29udHJvbFRpbWVySG5kbAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBpcyB0aGUgdGltZXIgY2FsbGJhY2sgd2hlbiB0aW1lciBmb3IgCisqKiAgICAgICAgICAgICAgIHNodXR0aW5nIHRoZSBUeCBpcyBleHBpcmVkCisqKgorKiogIFBBUkFNRVRFUlM6ICB2b2lkCisqKgorKiogIE9VVFBVVFM6ICAgICB2b2lkCisqKgorKiogIFJFVFVSTlM6ICAgICB2b2lkCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgb251RXBvblR4Q29udHJvbFRpbWVySG5kbCh2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25UeENvbnRyb2xUaW1lcklkKSk7CisKKyAgICAvKiBUdXJuIG9mZiB0aGUgdHggcG93ZXIgKi8KKyAgICBvbnVQb25UeFBvd2VyT24oTVZfRkFMU0UpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb251UG9uSXJxTG9jaywgZmxhZ3MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwKKyoqICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisqKgorKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gaXMgdGhlIHRpbWVyIGNhbGxiYWNrIHdoZW4gdGltZXIgZm9yIAorKiogICAgICAgICAgICAgICBrZWVwaW5nIHBvd2VyIHNhdmluZyBtb2RlIGlzIGV4cGlyZWQKKyoqCisqKiAgUEFSQU1FVEVSUzogIHZvaWQKKyoqCisqKiAgT1VUUFVUUzogICAgIHZvaWQKKyoqCisqKiAgUkVUVVJOUzogICAgIHZvaWQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7CisgICAgCisgICAgb251UG9uVGltZXJEaXNhYmxlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uTWF4U2xlZXBUaW1lcklkKSk7CisKKyAgICBpZiAob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQub251UG9uVGltZXJBY3RpdmUgPT0gT05VX1BPTl9USU1FUl9BQ1RJVkUpCisgICAgeworICAgICAgICBvbnVQb25UaW1lckRpc2FibGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCkpOworICAgIH0KKworICAgIC8qIExlYXZlIHBvd2VyIHNhdmluZyBtb2RlICovCisgICAgb251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNTZXQoRV9FUE9OX05PVF9QT1dFUl9TQVZJTkdfU1RBVFVTKTsKKworICAgIC8qIEVuYWJsZSBUWC9SWCAqLworICAgIG12RXBvbkFwaVNsZWVwTW9kZUN0cmwoTVZfRkFMU0UpOworCisgICAgLyogU2VuZCBTbGVlcFN0YXR1c1VwZGF0ZSBhbGFybSB0byBPTFQgKi8KKyAgICAvLyB0b2RvCisgICAgCisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiBpcyB0aGUgdGltZXIgY2FsbGJhY2sgd2hlbiBwZXJpb2RpY2FsIHRpbWVyIGZvcgorKiogICAgICAgICAgICAgICBzd2l0Y2hpbmcgYmV0d2VlbiBzbGVlcCBzdGF0dXMgYW5kIHdha2V1cCBzdGF0dXMgaXMgZXhwaXJlZAorKioKKyoqICBQQVJBTUVURVJTOiAgdm9pZAorKioKKyoqICBPVVRQVVRTOiAgICAgdm9pZAorKioKKyoqICBSRVRVUk5TOiAgICAgdm9pZAorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbCh2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJm9udVBvbklycUxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICBpZiAob251RXBvbkRiT251U2xlZXBXYWtldXBTdGF0dXNHZXQoKSA9PSBFX0VQT05fUE9XRVJfU0FWSU5HX1NMRUVQX1NUQVRVUykKKyAgICB7CisgICAgICAgIC8qIENoYW5nZSB0aGUgc3RhdHVzIHRvIHdha2V1cCAqLworICAgICAgICBvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c1NldChFX0VQT05fUE9XRVJfU0FWSU5HX1dBS0VVUF9TVEFUVVMpOworICAgICAgICAKKyAgICAgICAgb251UG9uVGltZXJVcGRhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25TbGVlcER1cmF0aW9uVGltZXJJZCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb251RXBvbkRiT251V2FrZXVwRHVyYXRpb25HZXQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIC8qIEVuYWJsZSBUWC9SWCAqLworICAgICAgICBtdkVwb25BcGlTbGVlcE1vZGVDdHJsKE1WX0ZBTFNFKTsKKyAgICB9CisgICAgZWxzZSBpZihvbnVFcG9uRGJPbnVTbGVlcFdha2V1cFN0YXR1c0dldCgpID09IEVfRVBPTl9QT1dFUl9TQVZJTkdfV0FLRVVQX1NUQVRVUykKKyAgICB7CisgICAgICAgIC8qIENoYW5nZSB0aGUgc3RhdHVzIHRvIHNsZWVwICovCisgICAgICAgIG9udUVwb25EYk9udVNsZWVwV2FrZXVwU3RhdHVzU2V0KEVfRVBPTl9QT1dFUl9TQVZJTkdfU0xFRVBfU1RBVFVTKTsKKyAgICAgICAgCisgICAgICAgIG9udVBvblRpbWVyVXBkYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9udUVwb25EYk9udVNsZWVwRHVyYXRpb25HZXQoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIC8qIERpc2FibGUgVFgvUlggKi8KKyAgICAgICAgbXZFcG9uQXBpU2xlZXBNb2RlQ3RybChNVl9UUlVFKTsKKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbnVQb25JcnFMb2NrLCBmbGFncyk7Cit9CisKICNlbmRpZiAvKiBQT05fRlBHQSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVCb2FyZC5oCmluZGV4IDQ2ZDE2OWMuLmYwYWFhOTkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251Qm9hcmQuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L2Vwb24vZXBvbk9udUJvYXJkLmgKQEAgLTkzLDYgKzkzLDkgQEAKIA0KIC8qIEdsb2JhbCBmdW5jdGlvbnMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KK3ZvaWQgb251RXBvblR4Q29udHJvbFRpbWVySG5kbCh2b2lkKTsNCit2b2lkIG9udUVwb25NYXhTbGVlcFRpbWVySG5kbCh2b2lkKTsNCit2b2lkIG9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbCh2b2lkKTsNCiANCiAjaWZuZGVmIFBPTl9GUEdBDQogTVZfU1RBVFVTIG9udUVwb25TZXJkZXNJbml0KHZvaWQpOw0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZXBvbi9lcG9uT251TG54S3NPcy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVMbnhLc09zLmMKaW5kZXggYWYzZDNlNS4uOTA1NjQ1NSAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVMbnhLc09zLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9lcG9uL2Vwb25PbnVMbnhLc09zLmMKQEAgLTI1Miw2ICsyNTIsNTIgQEAKICAgICByZXR1cm4oTVZfRVJST1IpOw0KICAgfQ0KIA0KKyAgICAvKiBPTlUgRVBPTiB0eF9wb3dlciBzdXBwbHkgY29udHJvbCB0aW1lciAqLw0KKyAgICAgcmV0Y29kZSA9IG9udVBvblRpbWVyQ3JlYXRlKCYob251UG9uUmVzb3VyY2VUYmxfcy5vbnVFcG9uVHhDb250cm9sVGltZXJJZCksICAgIC8qIHRpbWVyIElkICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVwb25fVHhDb250cm9sVGltZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZGVzY3JpcHRpb24gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFRJTUVSX0ZVTkNQVFIpb251RXBvblR4Q29udHJvbFRpbWVySG5kbCwgICAgICAgICAvKiB0aW1lciBmdW5jdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uIHBhcmFtICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05VX1BPTl9USU1FUl9OT1RfQUNUSVZFICwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5pdCB2YWx1ZSAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlvZGljIHZhbHVlICovDQorICAgIGlmIChyZXRjb2RlICE9IE1WX09LKQ0KKyAgICB7DQorICAgICAgICBtdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0FQSV9NT0RVTEUsDQorICAgICAgICAgICAgICAgICAgICJFUlJPUjogKCVzOiVkKSBFUE9OIFR4IHBvd2VyIGNvbnRyb2wgdGltZXIgY3JlYXRlXG5cciIsIA0KKyAgICAgICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7DQorICAgICAgICByZXR1cm4gKE1WX0VSUk9SKTsNCisgICAgfQ0KKw0KKyAgICAgLyogT05VIEVQT04gc2xlZXAgbW9kZTogbWF4IHNsZWVwIHRpbWVyICovDQorICAgICByZXRjb2RlID0gb251UG9uVGltZXJDcmVhdGUoJihvbnVQb25SZXNvdXJjZVRibF9zLm9udUVwb25NYXhTbGVlcFRpbWVySWQpLCAgICAgLyogdGltZXIgSWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXBvbl9NYXhTbGVlcFRpbWVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBkZXNjcmlwdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVElNRVJfRlVOQ1BUUilvbnVFcG9uTWF4U2xlZXBUaW1lckhuZGwsICAgICAgICAgIC8qIHRpbWVyIGZ1bmN0aW9uICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZnVuY3Rpb24gcGFyYW0gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHZhbHVlICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGVyaW9kaWMgdmFsdWUgKi8NCisgICAgaWYgKHJldGNvZGUgIT0gTVZfT0spDQorICAgIHsNCisgICAgICAgIG12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fQVBJX01PRFVMRSwNCisgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIEVQT04gcG93ZXIgc2F2aW5nIG1vZGU6IG1heCBzbGVlcCB0aW1lciBjcmVhdGVcblxyIiwgDQorICAgICAgICAgICAgICAgICAgIF9fRklMRV9ERVNDX18sIF9fTElORV9fKTsNCisgICAgICAgIHJldHVybiAoTVZfRVJST1IpOw0KKyAgICB9DQorDQorICAgIC8qIE9OVSBFUE9OIHNsZWVwIG1vZGU6IHNsZWVwIGR1cmF0aW9uIGFuZCB3YWl0IGR1cmF0aW9uIHRpbWVyICovDQorICAgIHJldGNvZGUgPSBvbnVQb25UaW1lckNyZWF0ZSgmKG9udVBvblJlc291cmNlVGJsX3Mub251RXBvblNsZWVwRHVyYXRpb25UaW1lcklkKSwgLyogdGltZXIgSWQgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcG9uX1NsZWVwV2FrZUR1cmF0aW9uVGltZXIiLCAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBkZXNjcmlwdGlvbiAqLw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBUSU1FUl9GVU5DUFRSKW9udUVwb25TbGVlcFdha2VEdXJhdGlvblRpbWVySG5kbCwgIC8qIHRpbWVyIGZ1bmN0aW9uICovDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGltZXIgZnVuY3Rpb24gcGFyYW0gKi8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9OVV9QT05fVElNRVJfTk9UX0FDVElWRSAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0IHZhbHVlICovIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBlcmlvZGljIHZhbHVlICovIA0KKyAgICBpZiAocmV0Y29kZSAhPSBNVl9PSykNCisgICAgew0KKyAgICAgICAgbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9BUElfTU9EVUxFLA0KKyAgICAgICAgICAgICAgICAgICAiRVJST1I6ICglczolZCkgRVBPTiBwb3dlciBzYXZpbmcgbW9kZTogc2xlZXAgYW5kIHdhaXQgZHVyYXRpb24gdGltZXIgY3JlYXRlXG5cciIsIA0KKyAgICAgICAgICAgICAgICAgICBfX0ZJTEVfREVTQ19fLCBfX0xJTkVfXyk7DQorICAgICAgICByZXR1cm4oTVZfRVJST1IpOw0KKyAgICB9DQorICANCisNCiAgIC8qIG9udSBlcG9uIHNpbGVuY2UgdGltZXIgKi8NCiAgIGZvciAoaWR4ID0gMDsgaWR4IDwgRVBPTl9NQVhfTUFDX05VTTsgaWR4KyspIA0KICAgew0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvZ3Bvbi9ncG9uT251TG54S3NPcy5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9ncG9uL2dwb25PbnVMbnhLc09zLmMKaW5kZXggYWNkNjU5ZS4uODZiOTIxYyAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9ncG9uL2dwb25PbnVMbnhLc09zLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9ncG9uL2dwb25PbnVMbnhLc09zLmMKQEAgLTE1NCw2ICsxNTQsOCBAQAogICAgIElOSVRfV09SSygoc3RydWN0IHdvcmtfc3RydWN0ICopICZncG9uVGNvbnRDbGVhbkFsbFdvcmssIG9udUdwb25XcVRjb250RnVuYyk7DQogICAgIGdwb25UY29udENsZWFuQWxsV29yay5hY3Rpb24gPSBUQ09OVF9DTEVBTl9BTExfRVZFTlQ7DQogDQorICAgIHByaW50aygiU1RBUlRJTkcgUE9OIFdPUksgUVVFVUUhISEhIVxuIik7DQorDQogICAgIHJldHVybihNVl9PSyk7DQogICB9DQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5jCmluZGV4IDBhM2QzNmUuLjc5ZDJlMTcgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmMKQEAgLTg4LDYgKzg4LDkgQEAKIAogLyogR2xvYmFsIGZ1bmN0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK01WX1UzMiBwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzNdID0gezB4QTVBNUE1QTUsIC8qIFszMTowMF0gKi8KKwkJCQkgICAgMHhBNUE1QTVBNSwgLyogWzYzOjMyXSAqLworCQkJCSAgICAweEE1QTV9OyAgICAvKiBbNzk6NjRdICovCiAKIC8qIExvY2FsIFZhcmlhYmxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMwMCw2ICszMDMsNDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoqCisqKiAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0CisqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworKioKKyoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIGluaXQgVXNlciBkZWZpbmVkIFBSQlMgcGF0dGVybgorKioKKyoqICBQQVJBTUVURVJTOiAgTm9uZQorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5TZXQoTVZfVTMyICpwcmJzVXNlclBhdHRlcm4pCit7CisgIHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF0gPSBwcmJzVXNlclBhdHRlcm5bMF07CisgIHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMV0gPSBwcmJzVXNlclBhdHRlcm5bMV07CisgIHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMl0gPSBwcmJzVXNlclBhdHRlcm5bMl07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG12T251UG9uTWFjUHJic1VzZXJEZWZpbmVkUGF0dGVybkdldAorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiByZXR1cm4gVXNlciBkZWZpbmVkIFBSQlMgcGF0dGVybgorKioKKyoqICBQQVJBTUVURVJTOiAgTm9uZQorKioKKyoqICBPVVRQVVRTOiAgICAgTm9uZQorKioKKyoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQoTVZfVTMyICpwcmJzVXNlclBhdHRlcm4pCit7CisgIHByYnNVc2VyUGF0dGVyblswXSA9IHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF07CisgIHByYnNVc2VyUGF0dGVyblsxXSA9IHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMV07CisgIHByYnNVc2VyUGF0dGVyblsyXSA9IHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMl07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgogKiogIG12T251UG9uTWFjQnVyc3RFbmFibGVJbml0CiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwogKioKQEAgLTM0Miw3ICszODcsMTAgQEAKIAkJCSAgICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBTVyBjdHJsIG5vdCBmb3JjZVxuXHIiKTsKIAkJICAgICAgIHJldHVybihNVl9FUlJPUik7CiAJICAgICAgIH0KLQl9IGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgeworCX0KKwllbHNlCisJeworCQlpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKSB7CiAKIAkJLyogS1cyIEFTSUMgUmV2IFoyICovCiAJCS8qID09PT09PT09PT09PT09PSAqLwpAQCAtMzYwLDI0ICs0MDgsMjYgQEAKIAkJaWYgKHN0YXR1cyA9PSBNVl9PSykKIAkJCXN0YXR1cyA9IG12R3BwVHlwZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCBncGlvTWFzayAvKiAwLWlucHV0IE5PVCBhbGxvdyB0cmFuc3NtaXQqLyk7CiAKLQl9IGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkgeworCQl9CisJCWVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9BMCkgewogCiAJCS8qIEtXMiBBU0lDIFJldiBBMCAqLwogCQkvKiA9PT09PT09PT09PT09PT0gKi8KIAkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBvdXRwdXQgc3RhdHVzIHNldCAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0JFTl9JT19FTiwgT05VX1BIWV9PVVRQVVQsIDApOwotCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7Ci0JCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCi0JCQkJICAgIkVSUk9SOiBhc2ljT250TWlzY1JlZ1dyaXRlIGZhaWxlZCBmb3IgUE9OIHBoeSBjdHJsIGVuYWJsZSAtIG91dHB1dFxuXHIiKTsKLQkJCXJldHVybihNVl9FUlJPUik7Ci0JCX0KKwkJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfQkVOX0lPX0VOLCBPTlVfUEhZX09VVFBVVCwgMCk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CisJCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZW5hYmxlIC0gb3V0cHV0XG5cciIpOworCQkJCXJldHVybihNVl9FUlJPUik7CisJCQl9CiAKLQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBkaXNhYmxlICovCi0JCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAwLCAwKTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewotCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBub3QgZm9yY2VcblxyIik7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOworCQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBkaXNhYmxlICovCisJCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMCwgMCk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CisJCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgbm90IGZvcmNlXG5cciIpOworCQkJCXJldHVybihNVl9FUlJPUik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTUxOSw1MyArNTY5LDU3IEBACiAJCSAgICAgICByZXR1cm4oTVZfRVJST1IpOwogCSAgICAgICB9CiAKLQl9IGVsc2UgaWYgKG12Q3RybFJldkdldCgpID09IE9OVV9BU0lDX1JFVl9aMikgeworCX0KKwllbHNlCisJeworCQlpZiAobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX1oyKSB7CiAKLQkgICAgCS8qIEFTSUMgUmV2IFoyICovCi0JICAgIAkvKiA9PT09PT09PT09PSAqLwotCQlQT05fR1BJT19HRVQoQk9BUkRfR1BQX1BPTl9YVlJfVFgsIGdwaW9Hcm91cCwgZ3Bpb01hc2spOwotCQlpZiAoZ3Bpb01hc2sgPT0gUE9OX0dQSU9fTk9UX1VTRUQpCi0JCQlyZXR1cm4gTVZfRVJST1I7CisJCQkvKiBBU0lDIFJldiBaMiAqLworCQkJLyogPT09PT09PT09PT0gKi8KKwkJCVBPTl9HUElPX0dFVChCT0FSRF9HUFBfUE9OX1hWUl9UWCwgZ3Bpb0dyb3VwLCBncGlvTWFzayk7CisJCQlpZiAoZ3Bpb01hc2sgPT0gUE9OX0dQSU9fTk9UX1VTRUQpCisJCQkJcmV0dXJuIE1WX0VSUk9SOwogCi0JCXRyYW5zX3ZhbHVlID0gKChvbiA9PSBNVl9UUlVFKSA/IChncGlvTWFzay8qMSovKSA6ICh+Z3Bpb01hc2svKjAqLykpOworCQkJdHJhbnNfdmFsdWUgPSAoKG9uID09IE1WX1RSVUUpID8gKGdwaW9NYXNrLyoxKi8pIDogKH5ncGlvTWFzay8qMCovKSk7CiAKLQkJc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB0cmFuc192YWx1ZSk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spCi0JCQlyZXR1cm4oTVZfRVJST1IpOwotCi0JfSBlbHNlIGlmIChtdkN0cmxSZXZHZXQoKSA9PSBPTlVfQVNJQ19SRVZfQTApIHsKLQotCQkvKiBBU0lDIFJldiBBMCAqLwotCQkvKiA9PT09PT09PT09PSAqLwotCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19FTiwgMSwgMCk7Ci0JCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKLQkJCW12UG9uUHJpbnQoUE9OX1BSSU5UX0VSUk9SLCBQT05fSVNSX01PRFVMRSwKLQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2VcblxyIik7Ci0JCQlyZXR1cm4oTVZfRVJST1IpOworCQkJc3RhdHVzID0gbXZHcHBWYWx1ZVNldChncGlvR3JvdXAsIGdwaW9NYXNrLCB0cmFuc192YWx1ZSk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKQorCQkJCXJldHVybihNVl9FUlJPUik7CiAJCX0KKwkJZWxzZSBpZgkobXZDdHJsUmV2R2V0KCkgPT0gT05VX0FTSUNfUkVWX0EwKSB7CiAKLSAgICAgICAgcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKKwkJCS8qIEFTSUMgUmV2IEEwICovCisJCQkvKiA9PT09PT09PT09PSAqLworCQkJLyogUEhZIGNvbnRyb2wgcmVnaXN0ZXIgLSBmb3JjZSBlbmFibGUgKi8KKwkJCXN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QT05fU0VSREVTX1BIWV9DVFJMXzFfRk9SQ0VfQkVOX0lPX0VOLCAxLCAwKTsKKwkJCWlmIChzdGF0dXMgIT0gTVZfT0spIHsKKwkJCQltdlBvblByaW50KFBPTl9QUklOVF9FUlJPUiwgUE9OX0lTUl9NT0RVTEUsCisJCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBmb3JjZVxuXHIiKTsKKwkJCQlyZXR1cm4oTVZfRVJST1IpOworCQkJfQogCi0JCS8qIFhWUiBwb2xhcml0eSAqLwotCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCi0JCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkJcG9sYXJpdHkgPSBvbnVQMlBEYlh2ckJ1cnN0RW5hYmxlUG9sYXJpdHlHZXQoKTsKIAotCQkvKiBQMlAgbW9kZSAqLwotCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLwotCQkvKiBGb3JjZSBWYWx1ZSA9PSAxLCB0cmFuc21pdCAxIHRvIHRoZSBsaW5lICAqLworCQkJLyogWFZSIHBvbGFyaXR5ICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMCwgQWN0aXZlIEhpZ2gsIHRyYW5zbWl0IDEgdG8gdGhlIGxpbmUgICovCisJCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgdHJhbnNtaXQgMCB0byB0aGUgbGluZSAgKi8KIAotCQkvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KLQkJLyogWFZSIHBvbGFyaXR5ID09IDAsIEFjdGl2ZSBIaWdoLCB3cml0ZSAxIGZvciBGb3JjZSBWYWx1ZSAqLwotCQkvKiBYVlIgcG9sYXJpdHkgPT0gMSwgQWN0aXZlIExvdywgd3JpdGUgMCBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJCS8qIFAyUCBtb2RlICovCisJCQkvKiBGb3JjZSBWYWx1ZSA9PSAwLCB0cmFuc21pdCAwIHRvIHRoZSBsaW5lICAqLworCQkJLyogRm9yY2UgVmFsdWUgPT0gMSwgdHJhbnNtaXQgMSB0byB0aGUgbGluZSAgKi8KIAotCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLwotCQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8xX0ZPUkNFX0JFTl9JT19WQUwsIHBvbGFyaXR5LCAwKTsKLQkJaWYgKHN0YXR1cyAhPSBNVl9PSykgewotCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAotCQkJCSAgICJFUlJPUjogYXNpY09udE1pc2NSZWdXcml0ZSBmYWlsZWQgZm9yIFBPTiBwaHkgY3RybCBmb3JjZSB2YWx1ZSAlZFxuXHIiLAotCQkJCSAgIHRyYW5zX3ZhbHVlKTsKLQkJCXJldHVybihNVl9FUlJPUik7CisJCQkvKiBTZXR0aW5nIFAyUCBzaG91bGQgYmUgcmV2ZXJzZWQgZnJvbSBYVlIgcG9sYXJpdHkgKi8KKwkJCS8qIFhWUiBwb2xhcml0eSA9PSAwLCBBY3RpdmUgSGlnaCwgd3JpdGUgMSBmb3IgRm9yY2UgVmFsdWUgKi8KKwkJCS8qIFhWUiBwb2xhcml0eSA9PSAxLCBBY3RpdmUgTG93LCB3cml0ZSAwIGZvciBGb3JjZSBWYWx1ZSAqLworCisJCQkvKiBQSFkgY29udHJvbCByZWdpc3RlciAtIGZvcmNlIGVuYWJsZSB2YWx1ZSAtIGFjY29yZGluZyB0byBwb2xhcml0eSAqLworCQkJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BPTl9TRVJERVNfUEhZX0NUUkxfMV9GT1JDRV9CRU5fSU9fVkFMLCBwb2xhcml0eSwgMCk7CisJCQlpZiAoc3RhdHVzICE9IE1WX09LKSB7CisJCQkJbXZQb25QcmludChQT05fUFJJTlRfRVJST1IsIFBPTl9JU1JfTU9EVUxFLAorCQkJCQkgICAiRVJST1I6IGFzaWNPbnRNaXNjUmVnV3JpdGUgZmFpbGVkIGZvciBQT04gcGh5IGN0cmwgZm9yY2UgdmFsdWUgJWRcblxyIiwKKwkJCQkJICAgdHJhbnNfdmFsdWUpOworCQkJCXJldHVybihNVl9FUlJPUik7CisJCQkJfQogCQl9CiAJfQogCkBAIC02MDUsNiArNjU5LDggQEAKIAkvKnBhdHRlcm4gdmFsaWRhdGlvbiovCiAJaWYgKCEoKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDEpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDIpIHx8CisJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVVNFUikgfHwKKyAgICAgICAgICAocGF0dGVybiA9PSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzcpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU185KSB8fAogCSAgICAgIChwYXR0ZXJuID09IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfMTUpIHx8CiAJICAgICAgKHBhdHRlcm4gPT0gT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU18yMykpKSB7CkBAIC02NjMsMTAgKzcxOSwzMiBAQAogCWlmIChzdGF0dXMgIT0gTVZfT0spCiAJCXJldHVybihzdGF0dXMpOwogCi0JLypzZXQgcGF0dGVybiB0eXBlKi8KLQlzdGF0dXMgID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBLCBwYXR0ZXJuLCAwKTsKLQlpZiAoc3RhdHVzICE9IE1WX09LKQotCQlyZXR1cm4oc3RhdHVzKTsKKyAgICAvKnNldCBwYXR0ZXJuIHR5cGUqLworICAgIGlmIChwYXR0ZXJuICE9IE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1VTRVIpCisgICAgeworICAgICAgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsIHBhdHRlcm4sIDApOworICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgICByZXR1cm4oc3RhdHVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAvKgorICAgICAgICoqICAweEYxMEEyRTZDIDwtIFBIWSBUZXN0IERhdGFbMTU6MF07ICBbVXNlckRhdGFbODowXSwgVHlwZSA9IDV9CisgICAgICAgKiogIDB4RjEwQTJFNjggPC0gUEhZIFRlc3QgRGF0YVszMToxNl07IFtVc2VyRGF0YVsyMzo5XX0KKyAgICAgICAqKiAgMHhGMTBBMkU2NCA8LSBQSFkgVGVzdCBEYXRhWzQ3OjMyXTsgW1VzZXJEYXRhWzM5OjI0XX0KKyAgICAgICAqKiAgMHhGMTBBMkU2MCA8LSBQSFkgVGVzdCBEYXRhWzYzOjQ4XTsgW1VzZXJEYXRhWzU1OjQwXX0KKyAgICAgICAqKiAgMHhGMTBBMkU1QyA8LSBQSFkgVGVzdCBEYXRhWzc5OjY0XTsgW1VzZXJEYXRhWzcxOjU2XX0KKyAgICAgICAqKiAgMHhGMTBBMkU1OCA8LSBQSFkgVGVzdCBEYXRhWzk2OjgwXTsgW1VzZXJEYXRhWzc5OjcyXX0KKyAgICAgICAqLworICAgICAgIHN0YXR1cyAgPSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsICAgICAgICAgKCgocHJic1VzZXJEZWZpbmVkUGF0dGVyblswXSAmICAweEZGKSA8PCA4KSAgIHwgKHBhdHRlcm4gJiAweEZGKSksIDApOworICAgICAgIHN0YXR1cyB8PSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMSwgICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblswXSA+PiA4KSAgJiAweEZGRkYpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDIsICgoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMF0gPj4gMjQpICYgMHhGRikgICB8ICgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsxXSAmIDB4RkYpIDw8IDgpKSwgMCk7CisgICAgICAgc3RhdHVzIHw9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAzLCAgKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzFdID4+IDgpICAmIDB4RkZGRiksIDApOworICAgICAgIHN0YXR1cyB8PSBhc2ljT250TWlzY1JlZ1dyaXRlKG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNCwgKCgocHJic1VzZXJEZWZpbmVkUGF0dGVyblsxXSA+PiAyNCkgJiAweEZGKSAgIHwgKChwcmJzVXNlckRlZmluZWRQYXR0ZXJuWzJdICYgMHhGRikgPDwgOCkpLCAwKTsKKyAgICAgICBzdGF0dXMgfD0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDUsICAoKHByYnNVc2VyRGVmaW5lZFBhdHRlcm5bMl0gPj4gOCkgICYgMHhGRiksIDApOworICAgICAgIGlmIChzdGF0dXMgIT0gTVZfT0spCisgICAgICAgICByZXR1cm4oc3RhdHVzKTsKKyAgICB9CiAKIAkvKnR1cm4gb24gc2VsZWN0ZWQgcGF0dGVybiovCiAJc3RhdHVzICA9IGFzaWNPbnRNaXNjUmVnV3JpdGUobXZBc2ljUmVnX1BUX1BBVFRFUk5fRU5BQkxFRCwgMHgxLCAwKTsKQEAgLTkwNCwxNSArOTgyLDE1IEBACiAqKgogKiogIG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eVNldAogKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KLSoqIAorKioKICoqICBERVNDUklQVElPTjogVGhlIGZ1bmN0aW9uIHNldHMgRVBPTiBYVlIgcG9sYXJpdHkgcmVnaXN0ZXIgdmFsdWUgaW4gdGhlIGRhdGFiYXNlCi0qKiAgICAgICAgICAgICAgIAorKioKICoqICBQQVJBTUVURVJTOiAgTVZfVTMyIHZhbAogKioKICoqICBPVVRQVVRTOiAgICAgTm9uZQogKioKICoqICBSRVRVUk5TOiAgICAgTVZfT0sgb3IgZXJyb3IKLSoqICAgICAgICAgICAgICAgICAgIAorKioKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5U2V0KE1WX1UzMiB2YWwpCiB7CkBAIC05MjUsMTUgKzEwMDMsMTUgQEAKICoqCiAqKiAgb251UDJQRGJYdnJCdXJzdEVuYWJsZVBvbGFyaXR5R2V0CiAqKiAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotKiogCisqKgogKiogIERFU0NSSVBUSU9OOiBUaGUgZnVuY3Rpb24gcmV0dXJucyBFUE9OIFhWUiBwb2xhcml0eSByZWdpc3RlciB2YWx1ZQotKiogICAgICAgICAgICAgICAKKyoqCiAqKiAgUEFSQU1FVEVSUzogIE5vbmUKICoqCiAqKiAgT1VUUFVUUzogICAgIE5vbmUKICoqCiAqKiAgUkVUVVJOUzogICAgIE1WX1UzMiBtb2RlCi0qKiAgICAgICAgICAgICAgICAgICAKKyoqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG9udVAyUERiWHZyQnVyc3RFbmFibGVQb2xhcml0eUdldCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5oIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVCb2FyZC5oCmluZGV4IDEwNzc0NDMuLjQ4MTllNzkgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfcG9uL3BsYXQvcG9uT251Qm9hcmQuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUJvYXJkLmgKQEAgLTkzLDcgKzkzLDkgQEAKIAogI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9UMSAgICAgICAgKDB4MSkKICNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVDIgICAgICAgICgweDIpCi0jZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfOSAgICAoMHg4MCkKKyNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfVVNFUiAgICAgICgweDUpCisjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfNyAgICAoMHg4MCkKKyNkZWZpbmUgT05VX1BPTl9UWF9QQVRURVJOX1RZUEVfUFJCU185ICAgICgweDgxKQogI2RlZmluZSBPTlVfUE9OX1RYX1BBVFRFUk5fVFlQRV9QUkJTXzE1ICAgKDB4ODIpCiAjZGVmaW5lIE9OVV9QT05fVFhfUEFUVEVSTl9UWVBFX1BSQlNfMjMgICAoMHg4MykKIApAQCAtMTU1LDYgKzE1Nyw4IEBACiBNVl9TVEFUVVMgb251UG9uTGVkSGFuZGxlcihNVl9VMzIgbGVkLCBNVl9VMzIgYWN0aW9uKTsKIE1WX1NUQVRVUyBvbnVQb25EeWluZ0dhc3BQcm9jZXNzKHZvaWQpOwogTVZfU1RBVFVTIG9udVBvbkR5aW5nR2FzcEV4aXQodm9pZCk7Cit2b2lkICAgICAgbXZPbnVQb25NYWNQcmJzVXNlckRlZmluZWRQYXR0ZXJuU2V0KE1WX1UzMiAqcHJic1VzZXJQYXR0ZXJuKTsKK3ZvaWQgICAgICBtdk9udVBvbk1hY1ByYnNVc2VyRGVmaW5lZFBhdHRlcm5HZXQoTVZfVTMyICpwcmJzVXNlclBhdHRlcm4pOwogTVZfU1RBVFVTIG12T251UG9uTWFjQnVyc3RFbmFibGVJbml0KHZvaWQpOwogTVZfU1RBVFVTIG12T251UG9uTWFjQnVyc3RFbmFibGVQb2xhcml0eUluaXQoTVZfVTMyIHBvbGFyaXR5KTsKIE1WX1NUQVRVUyBvbnVQb25QYXR0ZXJuQnVyc3RPbihNVl9VMzIgcGF0dGVybiwgTVZfQk9PTCBpc1BlcmlvZGljLCBNVl9VMzIgcGVyaW9kLCBNVl9VMzIgZHVyYXRpb24pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl9wb24vcGxhdC9wb25PbnVMbnhLc09zLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUxueEtzT3MuaAppbmRleCA1MjA1ZTFjLi5jM2IxYjY0IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUxueEtzT3MuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3Bvbi9wbGF0L3Bvbk9udUxueEtzT3MuaApAQCAtMTg0LDEwICsxODQsMTMgQEAKICNkZWZpbmUgT05VX1BPTl9USU1FUl9IV19SUFJUX1QwX0lOVEVSVkFMICAgICgyKSAgICAgLyogMiBtc2VjICovDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX0hXX1JQUlRfVDFfSU5URVJWQUwgICAgKDE1MCkgICAvKiAxNTAgbXNlYyAqLw0KICNkZWZpbmUgT05VX1BPTl9USU1FUl9IT0xET1ZFUl9JTlRFUlZBTCAgICAgICgyMDApICAgLyogMjAwIG1zZWMgKi8NCisjZGVmaW5lIE9OVV9QT05fVElNRVJfTUFYX1NMRUVQX0lOVEVSVkFMICAgICAoNjAwMDApIC8qIDYwIHNlYyAqLw0KKyNkZWZpbmUgT05VX1BPTl9USU1FUl9TTEVFUF9EVVJBVElPTiAgICAgICAgICg1MDApICAgIC8qIDAuNSBzZWMgKi8NCisjZGVmaW5lIE9OVV9QT05fVElNRVJfV0FLRVVQX0RVUkFUSU9OICAgICAgICAoNTAwKSAgICAvKiAwLjUgc2VjICovDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX1NJTEVOQ0VfSU5URVJWQUwgICAgICAgKDYwMDAwKSAvKiA2MCBzZWMgKi8NCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfVFhfTU9EX0lOVEVSVkFMICAgICAgICAoMSkgICAvKiAxIG1zZWMgKi8NCiAjZGVmaW5lIE9OVV9QT05fVElNRVJfRVZFTlRfTUlTU19JTlRFUlZBTCAgICAoMTApICAgLyogMTAgbXNlYyAqLw0KLSNkZWZpbmUgT05VX1BPTl9USU1FUl9UWF9QV1JfSU5URVJWQUwgICAgICAgICg2MDAwKSAgLyogMSAgIHNlYyAgKi8NCisjZGVmaW5lIE9OVV9QT05fVElNRVJfVFhfUFdSX0lOVEVSVkFMICAgICAgICAoMTAwMCkgIC8qIDEgc2VjICovDQogDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX0FDVElWRSAgICAgICAgICAgICAgICAgKDEpDQogI2RlZmluZSBPTlVfUE9OX1RJTUVSX05PVF9BQ1RJVkUgICAgICAgICAgICAgKDApDQpAQCAtMjU2LDYgKzI1OSwxMSBAQAogICBTX09udVBvblRpbWVyIG9udVBvblR4UHdyVGltZXJJZDsgICAgICAgICAvKiBPTlUgUE9OIFRYIFBvd2VyIHRpbWVyICovDQogICBTX09udVBvblRpbWVyIG9udVBvblBtVGltZXJJZDsgICAgICAgICAgICAvKiBPTlUgUE9OIFBNIHRpbWVyICovDQogICBTX09udVBvblRpbWVyIG9udVBvblBhdHRlcm5CdXJzdFRpbWVySWQ7ICAvKiBPTlUgUE9OIFBhdHRlcm4gQnVyc3QgdGltZXIgKi8NCisNCisgICAgU19PbnVQb25UaW1lciBvbnVFcG9uVHhDb250cm9sVGltZXJJZDsgICAgICAvKiBFUE9OIHR4X2NvbnRyb2wgZGVsYXkgdGltZXIgKi8NCisgICAgU19PbnVQb25UaW1lciBvbnVFcG9uTWF4U2xlZXBUaW1lcklkOyAgICAgICAvKiBFUE9OIHBvd2VyX3NhdmluZyBtb2RlOiBtYXggc2xlZXAgZHVyYXRpb24gdGltZXIgKi8NCisgICAgU19PbnVQb25UaW1lciBvbnVFcG9uU2xlZXBEdXJhdGlvblRpbWVySWQ7ICAvKiBFUE9OIHBvd2VyX3NhdmluZyBtb2RlOiBzbGVlcCBkdXJhdGlvbiBhbmQgd2FpdCBkdXJhdGlvbiB0aW1lciAqLw0KKyAgDQogI2lmbmRlZiBQT05fRlBHQSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgIFNfT251UG9uVGltZXIgb251UG9uSXNyWHZyUnN0VGltZXJJZDsgICAgIC8qIE9OVSBQT04gWFZSIFJlc2V0IHRpbWVyICovDQogI2VuZGlmIC8qIFBPTl9GUEdBICovICAgICAgICAgICAgICAgICAgICAgICANCkBAIC0yNzUsNiArMjgzLDcgQEAKIC8qIEdsb2JhbCB2YXJpYWJsZXMNCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KIGV4dGVybiBTX09udVBvblJlc291cmNlVGJsIG9udVBvblJlc291cmNlVGJsX3M7DQorZXh0ZXJuIHNwaW5sb2NrX3Qgb251UG9uSXJxTG9jazsNCiANCiAvKiBHbG9iYWwgZnVuY3Rpb25zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCkBAIC0zMTUsNiArMzI0LDggQEAKIGV4dGVybiBNVl9TVEFUVVMgcG9uT251R2V0UHJpbnRTdGF0dXMoTVZfVTMyIG1vZHVsZSwgTVZfVTMyICpwcmludExldmVsLCBNVl9VMzIgKm1vZHVsZU9wdGlvbnMpOw0KIGV4dGVybiBpbnQgICAgICAgcG9uT251UHJpbnRTdGF0dXMoY2hhciogYnVmKTsNCiANCitleHRlcm4gaW50IAkgb251R3BvblVpQ2ZnUHJic1VzZXJQYXR0ZXJuKGNoYXIqIGJ1Zik7DQorDQogLyogTWFjcm9zDQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gICAgDQogDQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fYXBpLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9hcGkuaAppbmRleCAxMWZkZDJkLi42MmY4YmYxIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9hcGkuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9hcGkuaApAQCAtNDE4MSw2ICs0MTgxLDM3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHBtX2Vycm9yX2NvZGVfdCB0cG1fZGVhY3RpdmVfdGNvbnQodWludDMyX3QgdGNvbnRfbnVtKTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogdHBtX3N3X3NldF9zdGF0aWNfbXVsdGljYXN0X21hYworKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIG9yIGRlc3RvcnkgYSBzdGF0aWMgTUFDIGVudHJ5IGluIHRoZSBNQUMgYWRkcmVzcyB0YWJsZSBmb3IgdGFnZXQKKyogICAgICAgVU5JIHBvcnQgYml0bWFwIGluIHRoZSBpbnRlZ3JhdGVkIHN3aXRjaAorKgorKiBJTlBVVFM6CisqICAgICAgIG93bmVyX2lkICAgIAktIEFQUCBvd25lciBpZCwgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBBUEkgY2FsbHMuCisqICAgICAgIHRwbV90cmdfcG9ydCAgICAtIHRhcmdldCBwb3J0IGJtIGluIFVOSSBwb3J0IGluZGV4LCBUUE1fVFJHX1VOSV8wIHwgVFBNX1RSR19VTklfMSB8IC4uLgorKiAgICAgICBzdGF0aWNfbWFjICAJLSA2IGJ5dGUgbmV0d29yayBvcmRlciBNQUMgc291cmNlIGFkZHJlc3MuCisqCisqIE9VVFBVVFM6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTlM6CisqICAgICAgIE9uIHN1Y2Nlc3MgLSBUUE1fUkNfT0suCisqICAgICAgIE9uIGVycm9yIGRpZmZlcmVudCB0eXBlcyBhcmUgcmV0dXJuZWQgYWNjb3JkaW5nIHRvIHRoZSBjYXNlIC0gc2VlIHRwbV9lcnJvcl9jb2RlX3QuCisqCisqIENPTU1FTlRTOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3RwbV9lcnJvcl9jb2RlX3QgdHBtX3N3X3NldF9zdGF0aWNfbXVsdGljYXN0X21hYworKAorICAgIHVpbnQzMl90ICAgICAgICAgICAgb3duZXJfaWQsCisgICAgdHBtX3RyZ19wb3J0X3R5cGVfdCB0cG1fdHJnX3BvcnQsCisgICAgdWludDhfdCAgICAgICAgICAgICBzdGF0aWNfbWFjWzZdCispOworCisKIC8qIE9MRCBBUEkgZnVuY3Rpb25zICovCiAjZGVmaW5lIHRwbV9hZGRfbDJfcHJpbV9hY2xfcnVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG1fYWRkX2wyX3J1bGUKICNkZWZpbmUgdHBtX2FkZF9sM190eXBlX2FjbF9ydWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbV9hZGRfbDNfdHlwZV9ydWxlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9pbml0LmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9pbml0LmMKaW5kZXggNGNmMzYzMi4uZjNmMzhmMiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1faW5pdC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX2luaXQuYwpAQCAtMzE1MSw2ICszMTUxLDcgQEAKIAl1aW50MzJfdCBpOwogCXVpbnQzMl90IHN3X3BvcnRfYm1wID0gMDsKIAl1bnNpZ25lZCBjaGFyIGdxX2RhWzZdID0geyAweDAxLCAweDAwLCAweDVlLCAweDAwLCAweDAwLCAweDAxIH07CisJdW5zaWduZWQgY2hhciBncV9tbGRfZGFbNl0gPSB7IDB4MzMsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfTsKIAl0cG1fZ21hY3NfZW51bV90IGdtYWNfaTsKIAlpbnQzMl90IHN3aXRjaF9wb3J0OwogCkBAIC0zMzIxLDcgKzMzMjIsOSBAQAogCX0KIAlpZiAobXZfc3dpdGNoX21hY19hZGRyX3NldChncV9kYSwgMCwgc3dfcG9ydF9ibXAsIDEpKQogCQlUUE1fT1NfV0FSTihUUE1fSU5JVF9NT0QsICJtdl9zd2l0Y2hfbWFjX2FkZHJfc2V0IGVyci4gc3dfcG9ydF9ibXAgMFgleFxuIiwgc3dfcG9ydF9ibXApOwotCisJaWYgKG12X3N3aXRjaF9tYWNfYWRkcl9zZXQoZ3FfbWxkX2RhLCAwLCBzd19wb3J0X2JtcCwgMSkpCisJCVRQTV9PU19XQVJOKFRQTV9JTklUX01PRCwgIm12X3N3aXRjaF9tYWNfYWRkcl9zZXQgZXJyLmZvciBtbGQgZ2VuZXJhbCBxdWVyeSBzd19wb3J0X2JtcCAwWCV4XG4iLCBzd19wb3J0X2JtcCk7CisgICAgCiAJLyogSWYgU3dpdGNoIHBvcnQgTUFDIG5vIGNvbm5lY3RlZCB0byBQSFksIGRpc2FibGUgR01BQyBQSFkgcG9sbGluZyAqLwogCWZvciAoZ21hY19pID0gVFBNX0VOVU1fR01BQ18wOyBnbWFjX2kgPCBUUE1fTUFYX05VTV9HTUFDUzsgZ21hY19pKyspIHsKIAkJaWYgKFRQTV9GQUxTRSA9PSB0cG1faW5pdC5nbWFjX3BvcnRfY29uZltnbWFjX2ldLnZhbGlkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fcGt0X3Byb2NfbG9naWMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL2NvcmUvdHBtX3BrdF9wcm9jX2xvZ2ljLmMKaW5kZXggZmQwYTgyNy4uMDVhZjc5ZCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vY29yZS90cG1fcGt0X3Byb2NfbG9naWMuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9jb3JlL3RwbV9wa3RfcHJvY19sb2dpYy5jCkBAIC04NCw5ICs4NCw3IEBACiAjaW5jbHVkZSAidHBtX2NvbW1vbi5oIgogI2luY2x1ZGUgInRwbV9oZWFkZXIuaCIKIAotLyogTG9jYWwgZGVmaW5pdGlvbnMgKi8KLWV4dGVybiBNVl9TVEFUVVMgbXZfY3VzdF9zZXRfdGNvbnRfc3RhdGUodWludDMyX3QgdGNvbnQsIGJvb2wgc3RhdGUpOwotCitleHRlcm4gaW50IGNwaF9zZXRfdGNvbnRfc3RhdGUodW5zaWduZWQgaW50IHRjb250LCBib29sIHN0YXRlKTsKIHR5cGVkZWYgdHBtX2Vycm9yX2NvZGVfdCAoKnRwbV9wcm9jX2NvbW1vbl9pbnRfZGVsX2Z1bmNfdCkgKHVpbnQzMl90LCB1aW50MzJfdCk7CiAKIGludDMyX3QgdHBtX3Byb2NfdmlydF91bmlfdHJnX3BvcnRfdmFsaWRhdGlvbih0cG1fdHJnX3BvcnRfdHlwZV90IHRyZ19wb3J0KTsKQEAgLTE0MjUwLDcgKzE0MjQ4LDcgQEAKIAkJcmV0X2NvZGUgPSB0cG1fZGJfYXBpX2VudHJ5X2ludmFsaWRhdGUoYXBpX3NlY3Rpb24sIHN0cmVhbV9udW0pOwogCQlJRl9FUlJPUihyZXRfY29kZSk7CiAKLQkJCisKIAkJaWYgKFRQTV9JUF9WRVJfNiA9PSBpcF92ZXJzaW9uKSB7CiAJCQkvKiByZW1vdmUgU0lQIFBOQyBlbnRyeSAqLwogCQkJcmV0X2NvZGUgPSB0cG1fZGJfZ2V0X2lwdjZfbWNfc3RyZWFtX2VudHJ5KHN0cmVhbV9udW0sICZtY19zdHJlYW0pOwpAQCAtMTc4MjUsNyArMTc4MjMsNyBAQAogCiAJLy9UUE1fT1NfSU5GTyhUUE1fUE5DTF9NT0QsICJwb3J0ID0gJWQgdHhwID0gJWQgZW5hYmxlID0gJWRcbiIsIHBvcnQsIHR4cCwgZW5hYmxlKTsKIAotICAgIHByaW50ayhLRVJOX0RFQlVHICJUUE0gVC1Db250IEFQSSwgcG9ydCglZCksIHR4cCglZCkgZW5hYmxlKCVkKVxuIiwgcG9ydCwgdHhwLCBlbmFibGUpOworCXByaW50aygiVFBNIFQtQ29udCBBUEksIHBvcnQoJWQpLCB0eHAoJWQpIGVuYWJsZSglZClcbiIsIHBvcnQsIHR4cCwgZW5hYmxlKTsKIAogCXR4X21vZCA9IHBvcnQgKyB0eHA7CiAKQEAgLTE3ODU1LDcgKzE3ODUzLDcgQEAKIAogCQkJLyogZW5hYmxlL2Rpc2FibGUgaHdmICovCiAJCQlpZiAoZW5hYmxlID09IHRydWUpCi0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkhXRiBULUNvbnQgYWN0aXZlLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJcHJpbnRrKCJIV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwogCiAJCQltdk5ldGFId2ZUeHFFbmFibGUoKHF1ZXVlX293bmVyIC0gMSksIHBvcnQsIHR4cCwgcV9udW0sIGVuYWJsZSk7CiAKQEAgLTE3ODY0LDcgKzE3ODYyLDcgQEAKIAkJCWlmICgoIWVuYWJsZSkgJiYgKGN1cnJfc3RhdGUpKQogCQkJewogCQkJCS8vVFBNX09TX0lORk8oVFBNX1BOQ0xfTU9ELCAiQ2FsbCBtdl9ldGhfdHhxX2NsZWFuIC0gY3VycmVudCBzdGF0ZTogJWQsIGVuYWJsZSAlZFxuIiwgY3Vycl9zdGF0ZSwgZW5hYmxlKTsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiSFdGIFQtQ29udCBzdG9wL2NsZWFuLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJcHJpbnRrKCJIV0YgVC1Db250IHN0b3AvY2xlYW4sIHBvcnQoJWQpLCB0eHAoJWQpLCBxdWUoJWQpXG4iLCBwb3J0LCB0eHAsIHFfbnVtKTsKIAkJCQltdl9ldGhfdHhxX2NsZWFuKHBvcnQsIHR4cCwgcV9udW0pOwogCQkJfQogCQl9CkBAIC0xNzg3NCwxNCArMTc4NzIsMTQgQEAKIAkJewogCQkJaWYgKCFlbmFibGUpCiAJCQl7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIlNXRiBULUNvbnQgc3RvcC9jbGVhbiwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwotCQkJCW12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHR4cCwgZmFsc2UpOworCQkJCXByaW50aygiU1dGIFQtQ29udCBzdG9wL2NsZWFuLCBwb3J0KCVkKSwgdHhwKCVkKSwgcXVlKCVkKVxuIiwgcG9ydCwgdHhwLCBxX251bSk7CisJCQkJY3BoX3NldF90Y29udF9zdGF0ZSh0eHAsIGZhbHNlKTsKIAkJCQltdl9ldGhfdHhxX2NsZWFuKHBvcnQsIHR4cCwgcV9udW0pOwogCQkJfQogCQkJZWxzZQogCQkJewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJTV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOwotCQkJCW12X2N1c3Rfc2V0X3Rjb250X3N0YXRlKHR4cCwgdHJ1ZSk7CisJCQkJcHJpbnRrKCJTV0YgVC1Db250IGFjdGl2ZSwgcG9ydCglZCksIHR4cCglZCksIHF1ZSglZClcbiIsIHBvcnQsIHR4cCwgcV9udW0pOworCQkJCWNwaF9zZXRfdGNvbnRfc3RhdGUodHhwLCB0cnVlKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BlcmYvdHBtX21uZ19pZi5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKaW5kZXggNmE0NjdiZS4uMGI5ZTcyOCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmMKQEAgLTE2OTUsNiArMTY5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgICAgIC8qID09PT09PSBNVl9UUE1fSU9DVExfU1dfU0VUX1NUQVRJQ19NVUxUSUNBU1RfTUFDID09PT09PT09PSAqLworICAgICAgICAgICAgICBjYXNlIE1WX1RQTV9JT0NUTF9TV19TRVRfU1RBVElDX01VTFRJQ0FTVF9NQUM6CisgICAgICAgICAgICAgICAgICByY29kZSA9IHRwbV9zd19zZXRfc3RhdGljX211bHRpY2FzdF9tYWMoICB0cG1fc3dfbWFjX3NlY3VyaXR5LT5vd25lcl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBtX3N3X21hY19zZWN1cml0eS0+cG9ydF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHRwbV9zd19tYWNfc2VjdXJpdHktPnN0YXRpY19tYWNbMF0pKTsKKyAgICAgICAgICAgICAgICAgIGlmKHJjb2RlICE9IFRQTV9PSykKKyAgICAgICAgICAgICAgICAgICAgZ290byBpb2N0bEVycjsKKyAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CiAgICAgICAgICAgfQpAQCAtMzgwMCw2ICszODEwLDcgQEAKIEVYUE9SVF9TWU1CT0wodHBtX3N3X2dldF9wb3J0X21pcnJvcik7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfaXNvbGF0ZV9ldGhfcG9ydF92ZWN0b3IpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfZ2V0X2lzb2xhdGVfZXRoX3BvcnRfdmVjdG9yKTsKK0VYUE9SVF9TWU1CT0wodHBtX3N3X3NldF9zdGF0aWNfbXVsdGljYXN0X21hYyk7CiBFWFBPUlRfU1lNQk9MKHRwbV9zd19zZXRfcG9ydF90YWdnZWQpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfc2V0X3BvcnRfdW50YWdnZWQpOwogRVhQT1JUX1NZTUJPTCh0cG1fc3dfc2V0X3BvcnRfZGVmX3ZsYW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGVyZi90cG1fbW5nX2lmLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaAppbmRleCA5Y2VmZmM2Li42MWIwZGY4IDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wZXJmL3RwbV9tbmdfaWYuaApAQCAtMzE5LDYgKzMxOSw3IEBACiAgICAgTVZfVFBNX0lPQ1RMX0FERF9JUHY0X01DX1NUUkVBTV9TRVRfUVVFVUUsCiAgICAgTVZfVFBNX0lPQ1RMX0FERF9JUHY2X01DX1NUUkVBTV9TRVRfUVVFVUUsCiAgICAgTVZfVFBNX0lPQ1RMX1NXX1BPUlRfQUREX1ZJRF9TRVRfRUdSRVNTX01PREUsCisgICAgTVZfVFBNX0lPQ1RMX1NXX1NFVF9TVEFUSUNfTVVMVElDQVNUX01BQywKIAogfSB0cG1faW9jdGxfY21kX3R5cGVfdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGxhdC90cG1fc3dpdGNoX21nci5jIGIvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9kcml2ZXJzX2xzcC9tdl90cG0vcGxhdC90cG1fc3dpdGNoX21nci5jCmluZGV4IGU2MmJjZTQuLjBiYTk0NzIgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfZHJpdmVyc19sc3AvbXZfdHBtL3BsYXQvdHBtX3N3aXRjaF9tZ3IuYworKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2RyaXZlcnNfbHNwL212X3RwbS9wbGF0L3RwbV9zd2l0Y2hfbWdyLmMKQEAgLTIzNCw2ICsyMzQsMTEzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgR01BQyBQb3J0IEF1dG8tTmVnb3RpYXRpb24gQ29uZmlndXJhdGlvbiBSZWdpc3RlciBpZiBQSFkgaXMKKyogICAgICAgIGNvbm5lY3RlZCB0byBHTUFDIGRpcmVjdGx5LiBNYWlseSBmb3IgTWVkaWEgQ29udmVydC4KKyoKKyogSU5QVVRTOgorKiAgICAgICBzcmNfcG9ydCAgICAgICAgIC0gU291cmNlIHBvcnQgaW4gVU5JIHBvcnQgaW5kZXgsIFVOSTAsIFVOSTEuLi5VTkk0LgorKiAgICAgICBhdXRvX25lZ29fZW4gLSBBdXRvLW5lZ290aWF0aW9uIGVuYWJsZSBzdGF0dXMKKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcyAtIFRQTV9SQ19PSy4KKyogICAgICAgT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UgLSBzZWUgdHBtX2Vycm9yX2NvZGVfdC4KKyoKKyogQ09NTUVOVFM6CisqICAgICAgICBOT05FLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB0cG1fZXJyb3JfY29kZV90IHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmModWludDMyX3Qgb3duZXJfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbV9zcmNfcG9ydF90eXBlX3Qgc3JjX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXV0b19uZWdvX2VuKQoreworICAgIHRwbV9lcnJvcl9jb2RlX3QgcmV0VmFsID0gVFBNX1JDX09LOworICAgIHRwbV9waHlfY3RybF90ICAgcGh5X2FjY2Vzc193YXk7CisgICAgdWludDMyX3Qgc3dpdGNoX2luaXQ7CisgICAgdHBtX2dtYWNzX2VudW1fdCBnbWFjX3BvcnQ7CisgICAgdWludDMyX3QgcGh5X2RpcmVjdF9hZGRyOworICAgIHRwbV9waHlfc3BlZWRfdCBjZmdfc3BlZWQ7CisgICAgYm9vbCAgY2ZnX2R1cGxleCwgY2ZnX2ZjOworCisgICAgcmV0VmFsID0gdHBtX3BoeV9hY2Nlc3NfY2hlY2soc3JjX3BvcnQsICZwaHlfYWNjZXNzX3dheSwgJnBoeV9kaXJlY3RfYWRkcik7CisgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSCisgICAgICAgICAgICAgICAiUG9ydCVkIFBIWSBhY2Nlc3Mgd2F5IGNoZWNrIGZhaWxlZFxuIiwgc3JjX3BvcnQpOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKyAgICAvKiBjaGVjayBzd2ljdGggaW5pdCBvciBub3QgKi8KKyAgICBpZiAodHBtX2RiX3N3aXRjaF9pbml0X2dldCgmc3dpdGNoX2luaXQpICE9IFRQTV9EQl9PSykgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIHRwbV9kYl9zd2l0Y2hfaW5pdF9nZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorICAgIC8qIFRoZSByb3V0aW5lIG9ubHkgYXBwbHkgUEhZIGNvbm5lY3RlZCB0byBHTUFDICovCisgICAgaWYgKChQSFlfU01JX01BU1RFUl9DUFUgPT0gcGh5X2FjY2Vzc193YXkpICYmCisgICAgICAgICAoIXN3aXRjaF9pbml0KSkgeworICAgICAgICBmb3IgKGdtYWNfcG9ydCA9IFRQTV9FTlVNX0dNQUNfMDsgZ21hY19wb3J0IDwgVFBNX01BWF9OVU1fR01BQ1M7IGdtYWNfcG9ydCsrKSB7CisgICAgICAgICAgICBpZiAocGh5X2RpcmVjdF9hZGRyID09IG12Qm9hcmRQaHlBZGRyR2V0KGdtYWNfcG9ydCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ21hY19wb3J0ID09IFRQTV9NQVhfTlVNX0dNQUNTKSB7CisgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIENhbiBub3QgZmluZCBnbWFjIHBvcnRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1dG9fbmVnb19lbikgey8qIGF1dG8tbmVnbyBlbmFibGUgKi8KKyAgICAgICAgICAgIGlmIChtdk5ldGFTcGVlZER1cGxleFNldCgoaW50KWdtYWNfcG9ydCwgTVZfRVRIX1NQRUVEX0FOLCBNVl9FVEhfRFVQTEVYX0FOKSAhPSBNVl9PSykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgbXZOZXRhU3BlZWREdXBsZXhTZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG12TmV0YUZsb3dDdHJsU2V0KChpbnQpZ21hY19wb3J0LCBNVl9FVEhfRkNfQU5fTk8pICAhPSBNVl9PSyl7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFGbG93Q3RybFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7LyogYXV0by1uZWdvIGRpc2FibGUgKi8KKyAgICAgICAgICAgIHJldFZhbCA9IHRwbV9waHlfZ2V0X3BvcnRfc3BlZWQob3duZXJfaWQsIHNyY19wb3J0LCAmY2ZnX3NwZWVkKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoJXM6JWQpIFBIWSBzcGVlZCBjb25maWcgZ2V0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldFZhbCA9IHRwbV9waHlfZ2V0X3BvcnRfZHVwbGV4X21vZGUob3duZXJfaWQsIHNyY19wb3J0LCAmY2ZnX2R1cGxleCk7CisgICAgICAgICAgICBpZiAocmV0VmFsKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBQSFkgZHVwbGV4IGNvbmZpZyBnZXQgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0VmFsID0gdHBtX3BoeV9nZXRfcG9ydF9mbG93X2NvbnRyb2xfc3VwcG9ydChvd25lcl9pZCwgc3JjX3BvcnQsICZjZmdfZmMpOworICAgICAgICAgICAgaWYgKHJldFZhbCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgUEhZIGZsb3cgY29udHJvbCBjb25maWcgZ2V0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtdk5ldGFTcGVlZER1cGxleFNldCgoaW50KWdtYWNfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX3NwZWVkICsgTVZfRVRIX1NQRUVEXzEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2ZnX2R1cGxleCA/IE1WX0VUSF9EVVBMRVhfRlVMTCA6IE1WX0VUSF9EVVBMRVhfSEFMRikpICE9IE1WX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogKCVzOiVkKSBtdk5ldGFTcGVlZER1cGxleFNldCBGYWlsZWRcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldFZhbCA9IEVSUl9HRU5FUkFMOworICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXZOZXRhRmxvd0N0cmxTZXQoKGludClnbWFjX3BvcnQsIChjZmdfZmMgPyBNVl9FVEhfRkNfRU5BQkxFIDogTVZfRVRIX0ZDX0RJU0FCTEUpKSAhPSBNVl9PSykgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRVJST1I6ICglczolZCkgbXZOZXRhRmxvd0N0cmxTZXQgRmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXRWYWwgPSBFUlJfR0VORVJBTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJQSFkgbm90IGNvbm5lY3RlZCB0byBHTUFDXG4iKTsKKyAgICAgICAgcmV0VmFsID0gRVJSX0dFTkVSQUw7CisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogdHBtX3N3X3NldF9kZWJ1Z190cmFjZV9mbGFnCiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtNDk4MSw2ICs1MDg4LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0VmFsID0gRVJSX1BIWV9TUkNfUE9SVF9DT05OX0lOVkFMSUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLyogVXBkYXRlIEdNQUMgc3BlZWQsIGR1cGxleCBhbmQgZmxvdyBjb250cm9sICovCisgICAgICAgIHJldFZhbCA9IHRwbV9zd19zZXRfZ21hY19zcGVlZF9kdXBsZXhfZmMob3duZXJfaWQsIHNyY19wb3J0LCAoc3RhdGUgPyB0cnVlIDogZmFsc2UpKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBUUE1fUkNfT0spIHsKKyAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHVwZGF0ZSBHTUFDIGNvbmZpZyB3aXRoIHBvcnQlZFxuIiwgc3JjX3BvcnQpOworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KICAgICAgICAgbFBvcnQgPSB0cG1fZGJfZXRoX3BvcnRfc3dpdGNoX3BvcnRfZ2V0KHNyY19wb3J0KTsKQEAgLTY0NDQsNiArNjU1NywxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTY2MTksNiArNjczOSwxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTc4ODMsNiArODAxMCwxMyBAQAogICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSCiAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiAoJXM6JWQpIFBIWSBMU1AgQVBJIGNhbGwgZmFpbGVkIG9uIHBvcnQoJWQpXG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBzcmNfcG9ydCk7CiAgICAgICAgICAgICByZXRWYWwgPSBFUlJfUEhZX1NSQ19QT1JUX0NPTk5fSU5WQUxJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVwZGF0ZSBHTUFDIHNwZWVkLCBkdXBsZXggYW5kIGZsb3cgY29udHJvbCAqLworICAgICAgICAgICAgcmV0VmFsID0gdHBtX3N3X3NldF9nbWFjX3NwZWVkX2R1cGxleF9mYyhvd25lcl9pZCwgc3JjX3BvcnQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXRWYWwgIT0gVFBNX1JDX09LKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gdXBkYXRlIEdNQUMgY29uZmlnIHdpdGggcG9ydCVkXG4iLCBzcmNfcG9ydCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFBIWSBhY2Nlc3NlZCB0aHJvdWdoIHN3aXRjaCwgYXMgb3JpZ2luYWwgZG8gKi8KQEAgLTgwMzYsMyArODE3MCw3MCBAQAogICAgICAgICAgICAgICAgICI9PUVYSVQ9PSAlc1xuXHIiLF9fRlVOQ1RJT05fXyk7CiAgICAgfQogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgb3IgZGVzdG9yeSBhIHN0YXRpYyBNQUMgZW50cnkgaW4gdGhlIE1BQyBhZGRyZXNzIHRhYmxlIGZvciB0YWdldAorKiAgICAgICBVTkkgcG9ydCBiaXRtYXAgaW4gdGhlIGludGVncmF0ZWQgc3dpdGNoCisqCisqIElOUFVUUzoKKyogICAgICAgb3duZXJfaWQgICAgCS0gQVBQIG93bmVyIGlkLCBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIEFQSSBjYWxscy4KKyogICAgICAgdHBtX3RyZ19wb3J0ICAgIC0gdGFyZ2V0IHBvcnQgYm0gaW4gVU5JIHBvcnQgaW5kZXgsIFRQTV9UUkdfVU5JXzAgfCBUUE1fVFJHX1VOSV8xIHwgLi4uCisqICAgICAgIHN0YXRpY19tYWMgIAktIDYgYnl0ZSBuZXR3b3JrIG9yZGVyIE1BQyBzb3VyY2UgYWRkcmVzcy4KKyoKKyogT1VUUFVUUzoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOUzoKKyogICAgICAgT24gc3VjY2VzcyAtIFRQTV9SQ19PSy4KKyogICAgICAgT24gZXJyb3IgZGlmZmVyZW50IHR5cGVzIGFyZSByZXR1cm5lZCBhY2NvcmRpbmcgdG8gdGhlIGNhc2UgLSBzZWUgdHBtX2Vycm9yX2NvZGVfdC4KKyoKKyogQ09NTUVOVFM6CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHBtX2Vycm9yX2NvZGVfdCB0cG1fc3dfc2V0X3N0YXRpY19tdWx0aWNhc3RfbWFjCisoCisgICAgdWludDMyX3QgICAgICAgICAgICBvd25lcl9pZCwKKyAgICB0cG1fdHJnX3BvcnRfdHlwZV90IHRwbV90cmdfcG9ydCwKKyAgICB1aW50OF90ICAgICAgICAgICAgIHN0YXRpY19tYWNbNl0KKykKK3sKKyAgICBpbnQzMl90IHJldF9jb2RlOworICAgIHVpbnQzMl90IHRyZ19wb3J0X2JtID0gMDsKKworICAgIFNXSVRDSF9JTklUX0NIRUNLKCk7CisKKyAgICBpZiAodHJhY2Vfc3dfZGJnX2ZsYWcpCisgICAgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAiPT1FTlRFUj09JXM6IG93bmVyX2lkWyVkXSx0cG1fdHJnX3BvcnRbMHgleF0sc3RhdGljX21hYyBbMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhdXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLG93bmVyX2lkLHRwbV90cmdfcG9ydCxzdGF0aWNfbWFjWzBdLHN0YXRpY19tYWNbMV0sIHN0YXRpY19tYWNbMl0sCisgICAgICAgICAgICAgICBzdGF0aWNfbWFjWzNdLHN0YXRpY19tYWNbNF0sIHN0YXRpY19tYWNbNV0pOworICAgIH0KKworCWlmKChzdGF0aWNfbWFjWzBdICE9IDB4MDEpICYmIChzdGF0aWNfbWFjWzBdICE9IDB4MzMgfHwgc3RhdGljX21hY1sxXSAhPSAweDMzKSkKKyAgICB7CisgICAgCXByaW50ayhLRVJOX0VSUgorICAgICAgICAgICAiJXM6JWQ6IGZ1bmN0aW9uIGZhaWxlZCwgMHgleDoleDoleDoleDoleDoleCBpcyBub3QgbXVsdGljYXN0IGFkZHJlc3MgXHJcbiIsIAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sX19MSU5FX18sIHN0YXRpY19tYWNbMF0sIHN0YXRpY19tYWNbMV0sIHN0YXRpY19tYWNbMl0sIHN0YXRpY19tYWNbM10sIAorICAgICAgICAgICBzdGF0aWNfbWFjWzRdLCBzdGF0aWNfbWFjWzVdKTsKKyAgICAJSUZfRVJST1IoRVJSX1NXX01BQ19JTlZBTElEKTsKKyAgICB9CisgICAgCisgICAgdHJnX3BvcnRfYm0gPSB0cG1fZGJfdHJnX3BvcnRfc3dpdGNoX3BvcnRfZ2V0KHRwbV90cmdfcG9ydCk7CisKKyAgICBpZiAodHBtX3RyZ19wb3J0ID09IDApIHsKKyAgICAgICAgcmV0X2NvZGUgPSB0cG1fc3dfZGVsX3N0YXRpY19tYWMoVFBNX01PRF9PV05FUl9UUE0sIHN0YXRpY19tYWMpOworICAgICAgICBJRl9FUlJPUihyZXRfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0X2NvZGUgPSB0cG1fc3dfc2V0X3N0YXRpY19tYWNfd19wb3J0c19tYXNrKFRQTV9NT0RfT1dORVJfVFBNLCB0cmdfcG9ydF9ibSwgc3RhdGljX21hYyk7CisgICAgICAgIElGX0VSUk9SKHJldF9jb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4oVFBNX1JDX09LKTsKK30KKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuYyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCmluZGV4IDNkNGQyZDAuLmZiYjU3NWYgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udU1hYy5jCkBAIC04MTk3LDYgKzgxOTcsMzAgQEAKICAgcmV0dXJuKHN0YXR1cyk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIG12T251RXBvbk1hY1NlcmRlc1B1UnhXcml0ZQorKiogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyoqCisqKiAgREVTQ1JJUFRJT046IFRoZSBmdW5jdGlvbiB3cml0ZSB0byBzZXJkZXMgcG93ZXIgdXAgcmVjZWl2ZXIgCisqKgorKiogIFBBUkFNRVRFUlM6ICBlbmFibGUgLSAwOiBwb3dlciBkb3duLCAxOiAgcG93ZXIgdXAKKyoqCisqKiAgT1VUUFVUUzogICAgIE5vbmUKKyoqCisqKiAgUkVUVVJOUzogICAgIE1WX09LIG9yIE1WX0VSUk9SCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdk9udUVwb25NYWNTZXJkZXNQdVJ4V3JpdGUoTVZfVTMyIGVuYWJsZSkKK3sKKyAgICBNVl9TVEFUVVMgc3RhdHVzOworCisgICAgc3RhdHVzID0gYXNpY09udE1pc2NSZWdXcml0ZShtdkFzaWNSZWdfUE9OX1NFUkRFU19QSFlfQ1RSTF8wX1BVX1JYLCBlbmFibGUsIDApOworCisgICAgcmV0dXJuKHN0YXR1cyk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251TWFjLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaAppbmRleCA0MWM2MmI4Li5iMTE1YzFhIDEwMDc1NQotLS0gYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaAorKysgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVNYWMuaApAQCAtNzM2LDYgKzczNiwxMSBAQAogTVZfU1RBVFVTIG12T251RXBvbk1hY0NwcVR4Q3RybFF1ZXVlRnJlZShNVl9VMzIgKmZyZWVDb3VudCwgTVZfVTMyIG1hY0lkKTsKIE1WX1NUQVRVUyBtdk9udUVwb25NYWNDcHFUeEN0cmxRdWV1ZVdyaXRlKE1WX1UzMiBkYXRhLCBNVl9VMzIgbWFjSWQpOwogCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICBTRVJERVMgRnVuY3Rpb25zIFNlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitNVl9TVEFUVVMgbXZPbnVFcG9uTWFjU2VyZGVzUHVSeFdyaXRlKE1WX1UzMiBlbmFibGUpOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmMgYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmMKaW5kZXggOGNlODNmMC4uYWYzOWY0MiAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5jCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuYwpAQCAtNzExLDcgKzcxMSwxMiBAQAogICBbbXZBc2ljUmVnX1BPTl9ER19USFJFU0hPTERdICAgICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QT05fREdfVEhSRVNIT0xELCAgICAgICAgICAgICAgICAgICAgICAweDE4Mjc0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDE4Mjc0LCAgYXNpY1JXLCAgICAgMHgwMDAwMDAwMCwgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJPTlUgRHlpbmcgR2FzcCB0aHJlc2hvbGQifSwKICAgW212QXNpY1JlZ19QVF9QQVRURVJOX1NFTEVDVF0gICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9TRUxFQ1QsICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgIGFzaWNSVywgICAgIDB4MDAwMDAwMDcsICAgICA1LCAgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgcGF0dGVybiBzZWxlY3QifSwKICAgW212QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRURdICAgICAgICAgICAgICAgICAgICA9IHttdkFzaWNSZWdfUFRfUEFUVEVSTl9FTkFCTEVELCAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMkU1NCwgIGFzaWNSVywgICAgIDB4MDAwMDAwMDEsICAgICAxNSwgICAgIDAsICAgICAwLCAgICAgIDAsICAgICAiUEhZIHRlc3QgcGF0dGVybiBlbmFibGVkIn0sCi0gIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBXSAgICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQSwgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNkMsICBhc2ljUlcsICAgICAweDAwMDAwMEZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHBhdHRlcm4gZGF0YSJ9LAorICBbbXZBc2ljUmVnX1BUX1BBVFRFUk5fREFUQV0gICAgICAgICAgICAgICAgICAgICAgID0ge212QXNpY1JlZ19QVF9QQVRURVJOX0RBVEEsICAgICAgICAgICAgICAgICAgICAgICAweEEyRTZDLCAgICAgICAgICAgICAgICAgICAgICAgICAweEEyRTZDLCAgYXNpY1JXLCAgICAgMHgwMDAwMDBGRiwgICAgIDAsICAgICAgMCwgICAgIDAsICAgICAgMCwgICAgICJQSFkgdGVzdCBwYXR0ZXJuIGRhdGEgLyB1c2VyIHBhdHRlcm4gWzE1OjBdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDFdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAxLCAgICAgICAgICAgICAgIDB4QTJFNjgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjgsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbMzE6MTZdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDJdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAyLCAgICAgICAgICAgICAgIDB4QTJFNjQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjQsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNDc6MzJdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDNdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAzLCAgICAgICAgICAgICAgIDB4QTJFNjAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNjAsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNjM6NDhdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDRdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA0LCAgICAgICAgICAgICAgIDB4QTJFNUMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNUMsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbNzk6NjRdIn0sCisgIFttdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDVdICAgCSAgICAgICAgPSB7bXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA1LCAgICAgICAgICAgICAgIDB4QTJFNTgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTJFNTgsICBhc2ljUlcsICAgICAweDAwMDBGRkZGLCAgICAgMCwgICAgICAwLCAgICAgMCwgICAgICAwLCAgICAgIlBIWSB0ZXN0IHVzZXIgcGF0dGVybiBbOTY6ODBdIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMF9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzBfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTU5MDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTU5MDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAwIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMV9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzFfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTVEMDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTVEMDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAxIn0sCiAgIFttdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVNdICAgICAgICAgICAgICAgICAgICAgPSB7bXZBc2ljUmVnX0dVTklUX1RYXzJfUVVFVUVTLCAgICAgICAgICAgICAgICAgICAgIDB4QTc5MDAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTc5MDAsICBhc2ljUlcsICAgICAweEZGRkZGRkZGLCAgICAgMCwgICAgICA4LCAgICAgMSwgICAgICAwLCAgICAgIkdQT04gR1VOSVQgUXVldWVzIGZvciBUWCAyIn0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmggYi9hcmNoL2FybS9wbGF0LWZlcm9jZW9uL212X2hhbC9wb24vbXZQb25PbnVSZWdzLmgKaW5kZXggOTZhNmJhMy4uY2RlMTQxOCAxMDA3NTUKLS0tIGEvYXJjaC9hcm0vcGxhdC1mZXJvY2Vvbi9tdl9oYWwvcG9uL212UG9uT251UmVncy5oCisrKyBiL2FyY2gvYXJtL3BsYXQtZmVyb2Nlb24vbXZfaGFsL3Bvbi9tdlBvbk9udVJlZ3MuaApAQCAtNjA3LDMzICs2MDcsMzggQEAKICAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgPSA0NTcsCiAgIG12QXNpY1JlZ19QVF9QQVRURVJOX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgID0gNDU4LAogICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQ1OSwKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzAxICAgICAgICAgICAgICAgICAgPSA0NjAsCisgIG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wMiAgICAgICAgICAgICAgICAgID0gNDYxLAorICBtdkFzaWNSZWdfUFRfUEFUVEVSTl9VU0VSX0RBVEFfMDMgICAgICAgICAgICAgICAgICA9IDQ2MiwKKyAgbXZBc2ljUmVnX1BUX1BBVFRFUk5fVVNFUl9EQVRBXzA0ICAgICAgICAgICAgICAgICAgPSA0NjMsCisgIG12QXNpY1JlZ19QVF9QQVRURVJOX1VTRVJfREFUQV8wNSAgICAgICAgICAgICAgICAgID0gNDY0LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDYwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDYzLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NjUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDY2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ2NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDcxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDc0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDQ3NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUVVFVUVTICAgICAgICAgICAgICAgICAgICAgICAgPSA0NzYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1FVRVVFUyAgICAgICAgICAgICAgICAgICAgICAgID0gNDc3LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDcwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDczLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0NzUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDc2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ3NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDgxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDg0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX01BWF9IRUFEX1NJWkVfQ0ZHICAgICA9IDQ4NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9NQVhfSEVBRF9TSVpFX0NGRyAgICAgPSA0ODYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfTUFYX0hFQURfU0laRV9DRkcgICAgID0gNDg3LAogCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8wX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDgwLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfMV9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4MSwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzJfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODIsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF8zX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDgzLAotICBtdkFzaWNSZWdfR1VOSVRfVFhfNF9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4NCwKLSAgbXZBc2ljUmVnX0dVTklUX1RYXzVfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0ODUsCi0gIG12QXNpY1JlZ19HVU5JVF9UWF82X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDg2LAotICBtdkFzaWNSZWdfR1VOSVRfVFhfN19QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ4NywKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzBfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTAsCisgIG12QXNpY1JlZ19HVU5JVF9UWF8xX1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDkxLAorICBtdkFzaWNSZWdfR1VOSVRfVFhfMl9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5MiwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzNfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTMsCisgIG12QXNpY1JlZ19HVU5JVF9UWF80X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDk0LAorICBtdkFzaWNSZWdfR1VOSVRfVFhfNV9QS1RfTU9EX1NUQVRTX1BLVF9DT1VOVCAgICAgICA9IDQ5NSwKKyAgbXZBc2ljUmVnX0dVTklUX1RYXzZfUEtUX01PRF9TVEFUU19QS1RfQ09VTlQgICAgICAgPSA0OTYsCisgIG12QXNpY1JlZ19HVU5JVF9UWF83X1BLVF9NT0RfU1RBVFNfUEtUX0NPVU5UICAgICAgID0gNDk3LAogCiAjZW5kaWYgLyogUE9OX0ZQR0EgKi8KICAgbXZBc2ljUmVnX01BWF9OVU1fT0ZfUkVHUwo=